《Squeeze-and-Excitation Networks》論文解析

論文鏈接:https://arxiv.org/abs/1709.01507
代碼地址:https://github.com/hujie-frank/SENet
PyTorch代碼地址:https://github.com/miraclewkf/SENet-PyTorch

Sequeeze-and-Excitation(SE) block並不是一個完整的網絡結構,而是一個子結構,可以嵌到其他分類或檢測模型中,作者採用SENet block和ResNeXt結合在ILSVRC 2017的分類項目中拿到第一,在ImageNet數據集上將top-5 error降低到2.251%,原先的最好成績是2.991%。
作者在文中將SENet block插入到現有的多種分類網絡中,都取得了不錯的效果。我們應該知道卷積神經網絡中,會有很多參數作用很小甚至是無效的,這在壓縮模型的時候被廣泛用到。SENet的核心思想在於通過網絡根據loss去學習特徵權重,使得有效的feature map權重大,無效或效果小的feature map權重小的方式訓練模型達到更好的結果。當然,SE block嵌在原有的一些分類網絡中不可避免地增加了一些參數和計算量,但是在效果面前還是可以接受的。

也許通過給某一層特徵配備權重的想法很多人都有,那爲什麼只有SENet成功了?個人認爲主要原因在於權重具體怎麼訓練得到。就像有些是直接根據feature map的數值分佈來判斷;有些可能也利用了loss來指導權重的訓練,不過全局信息該怎麼獲取和利用也是因人而異。

Figure1表示一個SE block。主要包含Squeeze和Excitation兩部分,接下來結合公式來講解Figure1。

首先Ftr這一步是轉換操作,也就是原網絡而已,在文中就是一個標準的卷積操作而已,輸入輸出的定義如下表示。

它的操作本質上就是卷積操作,定義如下(vc表示第c個卷積核,xs表示第s個輸入):

經過Ftr後,我們就得到了提取後的特徵(卷積神經網絡本質上就是提取特徵)。這時候的特徵shape爲H*W*C,H和W分別爲高和寬,C爲channel數目(Figure1中左數第二個)。

接下來就是Squeeze操作,公式非常簡單,就是一個global average pooling:

把H*W*C的輸入轉換爲1*1*C的輸出,對應Figure1中的Fsq操作。爲什麼會有這一步呢?這一步的結果相當於表明該層C個feature map的數值分佈情況,或者叫全局信息。

再接下來就是Excitation操作,如公式3。直接看最後一個等號,前面squeeze得到的結果是z,這裏先用W1乘以z,就是一個全連接層操作,W1的維度是C/r * C,這個r是一個縮放參數,在文中取的是16,這個參數的目的是爲了減少channel個數從而降低計算量。又因爲z的維度是1*1*C,所以W1z的結果就是1*1*C/r;然後再經過一個ReLU層,輸出的維度不變;然後再和W2相乘,和W2相乘也是一個全連接層的過程,W2的維度是C*C/r,因此輸出的維度就是1*1*C;最後再經過sigmoid函數,得到s。

也就是說最後得到的這個s的維度是1*1*C,C表示channel數目。這個s其實是本文的核心,它是用來刻畫tensor U中C個feature map的權重。而且這個權重是通過前面這些全連接層和非線性層學習得到的,因此可以end-to-end訓練。這兩個全連接層的作用就是融合各通道的feature map信息,因爲前面的squeeze都是在某個channel的feature map裏面操作。

在得到s之後,就可以對原來的tensor U操作了,就是下面的公式4。也很簡單,就是channel-wise multiplication,什麼意思呢?uc是一個二維矩陣,sc是一個數,也就是權重,因此相當於把uc矩陣中的每個值都乘以sc。對應Figure1中的Fscale。

 

公式就是以上所示了。我們看看在實際網絡中如何添加SE block,首先是inception:

其次是resnet:

 

看完結構,再來看添加了SE block後,模型的參數到底增加了多少。其實從前面的介紹可以看出增加的參數主要來自兩個全連接層,兩個全連接層的維度都是C/r * C,那麼這兩個全連接層的參數量就是2*C^2/r。以ResNet爲例,假設ResNet一共包含S個stage,每個Stage包含N個重複的residual block,那麼整個添加了SE block的ResNet增加的參數量就是下面的公式:

除了公式介紹,文中還舉了更詳細的例子來說明參數增加大概是多少百分比:In total, SE-ResNet-50 introduces 2.5 million additional parameters beyond the 25 million parameters required by ResNet-50, corresponding to a 10% increase in the total number of parameters。而且從公式5可以看出,增加的參數和C關係很大,而網絡越到高層,其feature map的channel個數越多,也就是C越大,因此大部分增加的參數都是在高層。同時作者通過實驗發現即便去掉最後一個stage的SE block,對模型的影響也非常小(<0.1% top-1 error),因此如果你對參數量的限制要求很高,倒是可以這麼做,畢竟具體在哪些stage,哪些block中添加SE block都是自由定義的。

Table2是將SE block添加到ResNet,ResNeXt和Inception三個模型中的效果對比,數據集都是ImageNet,可以看出計算複雜度的增加並不明顯(增加的主要是全連接層,全連接層其實主要還是增加參數量,對速度影響不會太大)。

既然是冠軍算法,文中也介紹了當時取得冠軍時的算法大致組成:Our winning entry comprised a small ensemble of SENets that employed a standard multi-scale and multi-crop fusion strategy to obtain a 2.251% top-5 error on the test set.This result represents a 25% relative improvement on the winning entry of 2016 (2.99% top-5 error). 也就是說其實是多模型做了融合。

另外前面提到過在SE block中第一個全連接層的維度是C/r * C,這個r在文中取的是16,作用在於將原來輸入是1*1*C的feature map縮減爲1*1*C/r的feature map,這一就降低了後面的計算量。而下面的Table5則是關於這個參數r取不同值時對結果和模型大小的影響。

當然除此之外作者還做了一些實驗,具體可以看原文章。

本文參考:

https://blog.csdn.net/u014380165/article/details/78006626

https://blog.csdn.net/evan123mg/article/details/80058077

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章