Pytorch AdaptiveAvgPool


torch.nn.functional.adaptive_avg_pool2d(input, output_size)

將輸入 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM