Pytorch層--AdaptiveAvgPool2d

翻譯自: https://discuss.pytorch.org/t/what-is-adaptiveavgpool2d/26897
知乎鏈接: https://www.zhihu.com/question/282046628

函數原型: nn.AdaptiveAvgPool2d(output_size)
原理解釋:
在這裏插入圖片描述
更多細節

池化模板大小計算(Pool Kernel Size): stencil_size=(input_size+target_size-1) // target_size, 即向上舍入。
基於stencil_size, 將計算應用池化模板的(起始)位置: 即計算[0,input_size) 之間的等距點

一個例子:
假設輸入大小爲14,目標大小爲4.那麼模板大小爲4。
四個等距點將分別爲0,3.33333,6.6666,10並且四捨五入爲0,3,7,10。因此,四個項目將是切片的平均值0:4, 3:7, 7:11, 10 :14(以Python方式,所以包括下限,不包括上限)。可以看到前兩個和最後兩個切片會有重疊。當輸入大小不能被目標大小整除時,通常會出現這種偶爾重疊1的情況。
對於實驗,您可以使用arange 和backward函數來查看發生的情況在如下示例中:

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就像你從上面切片得到的那樣並取平均值。
梯度a.grad顯示“每個輸出的感知字段”:
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
再次,您在第3項和第10項看到重疊。


對等分點計算的疑惑解釋:
爲了從總長度爲14(= input_size)的數組中獲得具有相同長度(4 = kernel_size)4部分(= target_size),允許一些重疊,我們首先將最右邊的部分分開:索引爲10,11,12和13。我們將索引0-10部分分成3(4 - 1)等分。

這是Thomas的例子中的numpy片段。

In [1]: import numpy as np

In [2]: input_size = 14

In [3]: output_size = 4

In [4]: kernel_size = (input_size + output_size - 1) // output_size

In [5]: kernel_size
Out[5]: 4

In [6]: np.linspace(start=0, stop=input_size - kernel_size, num=output_size)
Out[6]: array([ 0.        ,  3.33333333,  6.66666667, 10.        ])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章