pytorch 實現
在一些論文中,我們可能會看到全局平均池化操作,但是我們從pytorch官方文檔中卻找不到這個API,那我們應該怎麼辦?
答案是:
利用現有的pooling API實現全局平均池化的效果。
首先我們簡單理解全局平均池化操作。
如果有一批特徵圖,其尺寸爲 [ B, C, H, W], 我們經過全局平均池化之後,尺寸變爲[B, C, 1, 1]。
也就是說,全局平均池化其實就是對每一個通道圖所有像素值求平均值,然後得到一個新的1 * 1的通道圖。
明白這個思路之後,我們就可以很容易實現全局平均池化了。
利用自適應平均池化就可以快速實現。或者自適應最大池化也可以,一樣。
In [1]: import torch
In [2]: a = torch.rand([4,3,4,4])
In [3]: a.size()
Out[3]: torch.Size([4, 3, 4, 4])
In [4]: b = torch.nn.functional.adaptive_avg_pool2d(a, (1,1)) # 自適應池化,指定池化輸出尺寸爲 1 * 1
In [5]: b.size()
Out[5]: torch.Size([4, 3, 1, 1])
作用和優點
首次提出全局平均池化概念的論文是:Network In Network, 作用和優點什麼的,都講的很清楚。
簡單轉譯一下,就是:
- 作用:如果要預測K個類別,在卷積特徵抽取部分的最後一層卷積層,就會生成K個特徵圖,然後通過全局平均池化就可以得到 K個1×1的特徵圖,將這些1×1的特徵圖輸入到softmax layer之後,每一個輸出結果代表着這K個類別的概率(或置信度 confidence),起到取代全連接層的效果。
- 優點:
- 和全連接層相比,使用全局平均池化技術,對於建立特徵圖和類別之間的關係,是一種更樸素的卷積結構選擇。
- 全局平均池化層不需要參數,避免在該層產生過擬合。
- 全局平均池化對空間信息進行求和,對輸入的空間變化的魯棒性更強。