1. 程式人生 > >CNN的全連線層已過時?全域性平均池化(GAP)瞭解一下

CNN的全連線層已過時?全域性平均池化(GAP)瞭解一下

Traditional Pooling Methods


要想真正的理解Global Average Pooling,首先要了解深度網路中常見的pooling方式,以及全連線層。

眾所周知CNN網路中常見結構是:卷積、池化和啟用。卷積層是CNN網路的核心,啟用函式幫助網路獲得非線性特徵,而池化的作用則體現在降取樣:保留顯著特徵、降低特徵維度,增大kernel的感受野。深度網路越往後面越能捕捉到物體的語義資訊,這種語義資訊是建立在較大的感受野基礎上。已古人的例子來做解釋,想必大家都知道盲人摸象這個成語的來歷,每個盲人只能觸控到大象的一部分,也就是隻能獲得local response,基於這些local response,盲人們很難猜對他們到底在摸什麼。即使是一個明眼人,眼睛緊貼這大象後背看,也很難猜到看的是什麼。這個例子告訴我們區域性資訊很難提供更高層的語義資訊,因此對feature map降維,進而增大後面各層kernel的感受野是一件很重要的事情。另外一點值得注意:pooling也可以提供一些旋轉不變性。

Fully Connected layer


很長一段時間以來,全連線網路一直是CNN分類網路的標配結構。一般在全連線後會有啟用函式來做分類,假設這個啟用函式是一個多分類softmax,那麼全連線網路的作用就是將最後一層卷積得到的feature map stretch成向量,對這個向量做乘法,最終降低其維度,然後輸入到softmax層中得到對應的每個類別的得分。

全連線層如此的重要,以至於全連線層過多的引數重要到會造成過擬合,所以也會有一些方法專門用來解決過擬合,比如dropout。

NIN(Network in Network) 這篇論文中提出了全域性平均池化的概念,究竟他和之前的全連線層有什麼區別呢?

全連線存在的問題:引數量過大,降低了訓練的速度,且很容易過擬合

全連線層將卷積層展開成向量之後不還是要針對每個feature map進行分類,而GAP的思路就是將上述兩個過程合二為一,一起做了。如圖所示:

由此就可以比較直觀地說明了。這兩者合二為一的過程我們可以探索到GAP的真正意義是:對整個網路在結構上做正則化防止過擬合。其直接剔除了全連線層中黑箱的特徵,直接賦予了每個channel實際的內別意義。

實踐證明其效果還是比較可觀的,同時GAP可以實現任意影象大小的輸入。但是值得我們注意的是,使用gap可能會造成收斂速度減慢。

參見https://blog.csdn.net/yimingsilence/article/details/79227668

global average pooling 與 average pooling 的差別就在 "global" 這一個字眼上。global 與 local 在字面上都是用來形容 pooling 視窗區域的。 local 是取 feature map 的一個子區域求平均值,然後滑動這個子區域; global 顯然就是對整個 feature map 求平均值了。