FractionalMaxPool2D

class paddle.nn. FractionalMaxPool2D ( output_size, kernel_size=None, random_u=None, return_mask=False, name=None ) [源代码]

对输入的 Tensor x 采取 2 维分数阶最大值池化操作,具体可以参考论文:

[1] Ben Graham, Fractional Max-Pooling. 2015. http://arxiv.org/abs/1412.6071

其中输出的 HW 由参数 output_size 决定。

对于各个输出维度,分数阶最大值池化的计算公式为:

\[ \begin{align}\begin{aligned}\alpha &= size_{input} / size_{output}\\index_{start} &= ceil( \alpha * (i + u) - 1)\\index_{end} &= ceil( \alpha * (i + 1 + u) - 1)\\Output &= max(Input[index_{start}:index_{end}])\\where, u \in (0, 1), i = 0,1,2...size_{output}\end{aligned}\end{align} \]

公式中的 u 即为函数中的参数 random_u。另外,由于 ceil 对于正小数的操作最小值为 1 ,因此这里需要再减去 1 使索引可以从 0 开始计数。

例如,有一个长度为 7 的序列 [2, 4, 3, 1, 5, 2, 3]output_size5random_u0.3。 则由上述公式可得 alpha = 7/5 = 1.4 , 索引的起始序列为 [0, 1, 3, 4, 6] ,索引的截止序列为 [1, 3, 4, 6, 7] 。 进而得到论文中的随机序列为 index_end - index_start = [1, 2, 1, 2, 1] 。 由于池化操作的步长与核尺寸相同,同为此随机序列,最终得到池化输出为 [2, 4, 1, 5, 3]

参数

  • output_size (int|list|tuple):算子输出图的尺寸,其数据类型为 int 或 list,tuple。如果输出为 tuple 或者 list,则必须包含两个元素, (H, W)HW 可以是 int ,也可以是 None ,表示与输入保持一致。

  • kernel_size (int|list|tuple, 可选) - 池化核大小。如果它是一个元组或列表,它必须包含两个整数值,(pool_size_Height, pool_size_Width)。若为一个整数,则表示 H 和 W 维度上均为该值,比如若 pool_size=2,则池化核大小为 [2,2]。默认为 None,表示使用 disjoint (non-overlapping) 模式。

  • random_u (float):分数阶池化操作的浮点随机数,取值范围为 (0, 1) 。默认为 None ,由框架随机生成,可以使用 paddle.seed 设置随机种子。

  • return_mask (bool,可选):如果设置为 True ,则会与输出一起返回最大值的索引,默认为 False

  • name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None

形状

  • x (Tensor):默认形状为(批大小,通道数,输出特征长度,宽度),即 NCHW 格式的 4-D Tensor。其数据类型为 float16, bfloat16, float32, float64。

  • output (Tensor):默认形状为(批大小,通道数,输出特征长度,宽度),即 NCHW 格式的 4-D Tensor。其数据类型与输入 x 相同。

返回

计算 FractionalMaxPool2D 的可调用对象

代码示例

>>> # fractional max pool2d
>>> # suppose input data in shape of [N, C, H, W], `output_size` is [m, n],
>>> # output shape is [N, C, m, n], fractional pool divide H and W dimensions
>>> # of input data into m * n grids and performs poolings in each
>>> # grid to get output.

>>> import paddle

>>> x = paddle.rand([2, 3, 32, 32])

>>> # disjoint: without `kernel_size`
>>> fractional_max_pool = paddle.nn.FractionalMaxPool2D(output_size=3)
>>> pool_out = fractional_max_pool(x=x)
>>> print(pool_out.shape)
[2, 3, 3, 3]

>>> # overlapping: with `kernel_size`
>>> fractional_max_pool = paddle.nn.FractionalMaxPool2D(kernel_size=2, output_size=3)
>>> pool_out = fractional_max_pool(x=x)
>>> print(pool_out.shape)
[2, 3, 3, 3]

>>> fractional_max_pool = paddle.nn.FractionalMaxPool2D(output_size=[2, 3], return_mask=True)
>>> pool_out, indices = fractional_max_pool(x=x)
>>> print(pool_out.shape)
[2, 3, 2, 3]
>>> print(indices.shape)
[2, 3, 2, 3]