Pooling

使用输入张量上的采样窗口计算每个通道的池化,得到输出张量。 支持的采样窗口形状为 2-D 或 3-D。

属性

pooling_type 池化操作可以是以下之一

  • MAX 对于每个输出元素,返回在其对应的采样窗口中找到的最大值。

  • AVERAGE 对于每个输出元素,返回在其对应的采样窗口中值的平均值。

  • MAX_AVERAGE_BLEND 对于每个输出元素,返回 MAXAVG 池化的加权和,其中 blend_factor 是混合因子。 \(pooling(\text{MAX_AVERAGE_BLEND})=(1-\text{blend_factor}) \cdot pooling(MAX) + \text{blend_factor} \cdot pooling(AVERAGE)\).

blend_factor 当池化类型设置为 MAX_AVERAGE_BLEND 时使用的参数。

padding_mode 填充模式。 填充模式可以是以下之一

\[\begin{split}\begin{gather} I = \text{输入图像的维度} \\ B = \text{预填充,在图像数据之前。 对于反卷积,预填充设置在输出之前。} \\ A = \text{后填充,在图像数据之后。 对于反卷积,后填充设置在输出之后。} \\ P = \text{输入和输出之间的差值} \\ S = \text{步长} \\ F = \text{滤波器} \\ O = \text{输出} \\ D = \text{扩张。 对于池化层,始终等于 1} \\ M = I + B + A\text{数据加上任何填充} \\ DK = 1 + D \cdot (F - 1) \\ \end{gather}\end{split}\]
  • EXPLICIT_ROUND_DOWN 使用显式填充,向下舍入输出大小。
    \(O = \lfloor\frac{M - DK}{S}\rfloor + 1\)
  • EXPLICIT_ROUND_UP 使用显式填充,向上舍入输出大小。
    \(O = \lceil\frac{M - DK}{S}\rceil + 1\)
  • SAME_UPPER 使用 SAME 填充,其中 \(\text{pre-padding} \leq \text{post-padding}\)
    \(\begin{gather}O = \lceil\frac{I}{S}\rceil \\ P = \lfloor\frac{I-1}{S}\rfloor \cdot S + DK -I \\ B = \lfloor\frac{P}{2}\rfloor \\ A = P - B \end{gather}\)
  • SAME_LOWER 使用 SAME 填充,其中 \(\text{pre-padding} \geq \text{post-padding}\)
    \(\begin{gather}O = \lceil\frac{I}{S}\rceil \\ P = \lfloor\frac{I-1}{S}\rfloor \cdot S + DK -I \\ A = \lfloor\frac{P}{2}\rfloor \\ B = P - A \end{gather}\)

average_count_excludes_padding 设置此参数后,平均池化计算将忽略填充的输入。

输入

input: 类型为 T 的张量

输出

output: 类型为 T 的张量

数据类型

T: int8, float16, float32

形状信息

输入张量必须是秩为 \(r\geq3\) 的张量。

输出张量秩与输入张量秩相同。 如果输入的形状为 \([a_0,...,a_n]\),步长为 \(s\),填充为 \(p\),采样窗口形状为 \([r_0,..,r_m]\) 其中 \(m=2\)\(m=3\)

\[\begin{split}b_i = \begin{cases} a_i &\mbox{如果 } i \in [0,n-m) \\ \frac{a_i + 2 \cdot p_{m+i-n} + r_{m+i-n}}{s_{m+i-n}} &\mbox{否则} \\ \end{cases}\end{split}\]

体积限制

inputoutput 最多可以有 \(2^{31}\) 个元素。

支持的格式

截至 TRT 10.5,TRT 仅支持用于 3D 池化的 FP32/FP16 NCHW 内核。

DLA 支持

DLA FP16 和 DLA INT8 支持 2D 池化的 max 池化,以及平均池化的包含性填充模式。

示例

Pooling
in1 = network.add_input("input1", dtype=trt.float32, shape=(1, 1, 5, 5))
layer = network.add_pooling_nd(in1, trt.PoolingType.MAX, trt.tensorrt.DimsHW(3, 3))
network.mark_output(layer.get_output(0))

inputs[in1.name] = np.array(
    [
        [
            [
                [-10.0, -9.0, -8.0, -7.0, -6.0],
                [-5.0, -4.0, -3.0, -2.0, -1.0],
                [0.0, 1.0, 2.0, 3.0, 4.0],
                [5.0, 6.0, 7.0, 8.0, 9.0],
                [10.0, 11.0, 12.0, 13.0, 14.0],
            ]
        ]
    ]
)
np.reshape(np.arange(-10, 15, dtype=np.float32), newshape=(1, 1, 5, 5))

outputs[layer.get_output(0).name] = layer.get_output(0).shape

expected[layer.get_output(0).name] = np.array([[[[2.0, 3.0, 4.0], [7.0, 8.0, 9.0], [12.0, 13.0, 14.0]]]])
in1 = network.add_input("input1", dtype=trt.float32, shape=(1, 1, 5, 5))
layer = network.add_pooling_nd(in1, trt.PoolingType.AVERAGE, trt.tensorrt.DimsHW(3, 3))
layer.post_padding = (1, 1)
layer.pre_padding = (1, 1)
layer.average_count_excludes_padding = True
network.mark_output(layer.get_output(0))

inputs[in1.name] = np.array(
    [
        [
            [
                [-10.0, -9.0, -8.0, -7.0, -6.0],
                [-5.0, -4.0, -3.0, -2.0, -1.0],
                [0.0, 1.0, 2.0, 3.0, 4.0],
                [5.0, 6.0, 7.0, 8.0, 9.0],
                [10.0, 11.0, 12.0, 13.0, 14.0],
            ]
        ]
    ]
)
np.reshape(np.arange(-10, 15, dtype=np.float32), newshape=(1, 1, 5, 5))

outputs[layer.get_output(0).name] = layer.get_output(0).shape

expected[layer.get_output(0).name] = np.array(
    [
        [
            [
                [-7.0, -6.5, -5.5, -4.5, -4.0],
                [-4.5, -4.0, -3.0, -2.0, -1.5],
                [0.5, 1.0, 2.0, 3.0, 3.5],
                [5.5, 6.0, 7.0, 8.0, 8.5],
                [8.0, 8.5, 9.5, 10.5, 11.0],
            ]
        ]
    ]
)

C++ API

有关 C++ IPoolingLayer 运算符的更多信息,请参阅 C++ IPoolingLayer 文档

Python API

有关 Python IPoolingLayer 运算符的更多信息,请参阅 Python IPoolingLayer 文档