torch.nn.functional.adaptive_avg_pool2d(input, output_size)
將輸入 NCHW 的 input 均值池化成 NC*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