将输入 NCHW 的 input 均值池化成 NC*output_size

用于均值池化的池化块的尺寸由以下公式决定:
\[pooling\_size = (input\_size + output\_size - 1)//output\_size\]

计算出来后,池化块的起始点就在 \(0- (input\_size - pooling\_size)\)中选取 output_size 个等分点

这里以一维均值池化为例,说明具体池化过程:

  • 假设你的输入尺寸是14个数字,然后期望池化后输出是4个数字

  • 这样,\(pooling\_size = (14 + 4 -1)//4=4\)
  • 因此,池化块的起始点在[0, 14-4] 即 [0, 10] 中选取4个等分点, 0,10已经有2个,需要再找两个,因此就是3.3333 和 6.66666,取整可得:0,3, 7,10;
  • 因此最终去均值的四个块的位置下标分别为:0-4, 3-7, 7-11, 10-14 (包括下界,不包括上界)
  • 可以看到第一个块和第二块在3这个位置出现了重叠,第三个块和第四个块在第10个位置出现了重叠;这对于 inputsize没法被output_size整除时是比较正常的现象。
a = torch.arange(0,14., requires_grad=True)
b = torch.nn.functional.adaptive_avg_pool1d(a[None, None], 4)
b.backward(torch.arange(1., 1+b.size(-1))[None,None])
print (b, a.grad)

此时 b 是 1.5, 4.5, 8.5, 11.5,与按照上面规则计算相同
再求导也可以看出来 第3个元素和第10个元素是重叠的:
0.2500, 0.2500, 0.2500, 0.7500, 0.5000, 0.5000, 0.5000, 0.7500, 0.7500, 0.7500, 1.7500, 1.0000, 1.0000, 1.0000

参考:
https://discuss.pytorch.org/t/what-is-adaptiveavgpool2d/26897
https://zhuanlan.zhihu.com/p/29923090

02-12 02:23