Squeeze-and-Excitation Networks(SENet)
在圖像中最早使用注意力機制的忘了就是SENet。SENet是Squeeze-and-Excitation Networks的簡稱,由Momenta公司所作并發于2017CVPR,論文中的SENet赢得了ImageNet最後一屆(ImageNet 2017)的圖像識别冠軍,SENet主要是學習了channel之間的相關性,篩選出了針對通道的注意力,稍微增加了一點計算量,但是效果比較好。
論文位址:https://arxiv.org/pdf/1709.01507.pdf
官方代碼位址:https://github.com/hujie-frank/SENet
Pytorch實作代碼:https://github.com/moskomule/senet.pytorch
文章目錄
- Squeeze-and-Excitation Networks(SENet)
-
- 結構介紹
- 代碼
- 參數分析
-
- 1. 縮減率
- 2. 壓縮操作(池化選擇)
- 3. 激活操作
- 4. 不同時期
- 5. 一體化戰略
- 結果展示

論文中的動機: 希望顯式地模組化特征通道之間的互相依賴關系,通過采用了一種全新的“特征重标定”政策–自适應地重新校準通道的特征響應 。具體來說, 通過學習的方式來自動擷取到每個特征通道的重要程度,然後依照這個重要程度去提升有用的特征并抑制對目前任務用處不大的特征。 該文提出的SE子產品思想簡單,易于實作,并且很容易可以加載到現有的網絡模型架構中。
結構介紹
Sequeeze:順着空間次元來進行特征壓縮,将每個二維的特征通道變成一個實數,這個實數某種程度上具有全局的感受野,并且輸出的次元和輸入的特征通道數相比對。它表征着在特征通道上響應的全局分布,而且使得靠近輸入的層也可以獲得全局的感受野。具體操作就是對原特征圖C * W * H 進行global average pooling,然後得到了一個 1 * 1 * C 大小的特征圖,這個特征圖具有全局感受野。
Excitation :輸出的1x1xC特征圖,再經過兩個全連接配接神經網絡,最後用一個類似于循環神經網絡中門的機制。通過參數來為每個特征通道生成權重,其中參數被學習用來顯式地模組化特征通道間的相關性(論文中使用的是sigmoid)。
如上圖所示,将特征為 Y ∗ W ∗ C Y*W*C Y∗W∗C的特整圖,經過全局池化後變為 1 ∗ 1 ∗ C 1*1*C 1∗1∗C的特征,然後将 1 ∗ 1 ∗ C 1*1*C 1∗1∗C的特征縮減為原來的 r r r分之一倍,減少全連接配接層的計算量,網絡經過ReLU激活函數後,再次經過第二個全連接配接層将特征從 1 ∗ 1 ∗ C / r 1*1*C/r 1∗1∗C/r再擴充為 1 ∗ 1 ∗ C 1*1*C 1∗1∗C,最終經過Sigmoid函數求出各層卷積的權重。
特征重标定:使用Excitation 得到的結果作為權重,然後通過乘法逐通道權重到U的C個通道上,完成在通道次元上對原始特征的重标定,并作為下一級的輸入資料。這種結構的原理是想通過控制scale的大小,把重要的特征增強,不重要的特征減弱,進而讓提取的特征指向性更強。
SENet 通俗的說就是:通過對卷積之後得到的feature map進行處理,得到一個和通道數一樣的一維向量作為每個通道的評價分數,然後将改動之後的分數通過乘法逐通道權重到原來對應的通道上,最後得到輸出結果,就相當于在原有的基礎上隻添加了一個子產品而已。
代碼
Pytorch代碼實作上述該子產品:
class SELayer(nn.Module):
def __init__(self, channel, reduction=16):
super(SELayer, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(channel, channel // reduction, bias=False),
nn.ReLU(inplace=True),
nn.Linear(channel // reduction, channel, bias=False),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.size()
y = self.avg_pool(x).view(b, c)
y = self.fc(y).view(b, c, 1, 1)
return x * y.expand_as(x)
代碼比較簡單,僅僅輸入特征與通道數就可以進行直接插入操作,非常友善快捷。其中參數
reduction
為縮減率。
參數分析
1. 縮減率
在SENet中引入的縮減率r是一個重要的超參數,也就是代碼中
reduction=16
。它允許改變模型中SE塊的容量和計算成本。為了研究這種關系,基于SE-ResNet-50架構進行了一系列不同rr值的實驗。表5中的比較表明,性能并沒有随着容量的增加而單調上升。這可能是使SE塊能夠過度拟合訓練集通道依賴性的結果。尤其是發現設定r=16在精度和複雜度之間取得了很好的平衡,是以将這個值用于所有的實驗。
2. 壓縮操作(池化選擇)
在選擇壓縮操作的激活函數時,考察了使用全局平均池而不是全局最大池的重要性(因為這種方法很有效,是以沒有考慮更複雜的替代方案)。結果見表11。最大池和平均池都是有效的,但平均池的性能稍好一些,這說明選擇平均池作為擠壓操作的依據。
3. 激活操作
論文評估了激勵機制的非線性選擇。考慮兩個進一步的選擇:ReLU和tanh,并實驗用這些可選的非線性替換sigmoid。結果見表12。将sigmoid替換為tanh會略微降低性能,而使用ReLU則會顯著降低性能,實際上會導緻SE-ResNet-50的性能低于ResNet-50基線的性能。這表明,為了使SE塊有效,謹慎地構造激勵算子是重要的。
4. 不同時期
如上圖所示,通過将SE塊逐級內建到ResNet-50中,探讨了SE塊在不同階段的影響。具體來說,将SE塊添加到中間階段:階段2、階段3和階段4,并将結果報告在表13中。觀察到SE塊在體系結構的每個階段引入時會帶來性能上的好處。此外,SE區塊在不同階段所帶來的收益是互補的,也就是說,它們可以有效地結合在一起,進一步提升網絡性能。
加粗樣式
5. 一體化戰略
最後進行消融研究,以評估SE塊的位置影響時,将其內建到現有的架構。除了提出的SE設計,考慮了三種變體:(1)SE- pre塊,其中SE塊移動到剩餘單元之前;(2) SE- post塊,其中SE單元與恒等分支(ReLU後)求和後移動;(3)SE- identity塊,其中SE單元與剩餘單元平行放置在恒等連接配接上。這些變體如圖5所示,每個變體的性能報告在表14中。觀察到SE- pre、SE- identity和提出的SE塊的性能相似,而使用SE- post塊會導緻性能下降。這個實驗表明,SE單元産生的性能改進對于它們的位置是相當穩健的,前提是它們在分支聚合之前被應用。
結果展示
上圖展示了SENet識别結果的,通過對比能夠看出,識别準确度存在一定的提升。
前大多數的主流網絡都是基于這兩種類似的單元通過repeat方式疊加來構造的。由此可見,SE子產品可以嵌入到現在幾乎所有的網絡結構中。通過在原始網絡結構的building block 單元中嵌入SE子產品,可以獲得不同種類的SENet 。如SE-BN-Inception、SE-ResNet 、SE-ReNeXt、SE-Inception-ResNet-v2等等。