計算機視覺注意力網絡(二)——SeNet [CVPR 2018]

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


在這裏插入圖片描述
論文中的動機: 希望顯式地建模特徵通道之間的相互依賴關係,通過採用了一種全新的“特徵重標定”策略–自適應地重新校準通道的特徵響應 。具體來說,通過學習的方式來自動獲取到每個特徵通道的重要程度,然後依照這個重要程度去提升有用的特徵並抑制對當前任務用處不大的特徵。 該文提出的SE模塊思想簡單,易於實現,並且很容易可以加載到現有的網絡模型框架中。

結構介紹

Sequeeze:順着空間維度來進行特徵壓縮,將每個二維的特徵通道變成一個實數,這個實數某種程度上具有全局的感受野,並且輸出的維度和輸入的特徵通道數相匹配。它表徵着在特徵通道上響應的全局分佈,而且使得靠近輸入的層也可以獲得全局的感受野。具體操作就是對原特徵圖C * W * H 進行global average pooling,然後得到了一個 1 * 1 * C 大小的特徵圖,這個特徵圖具有全局感受野。

Excitation :輸出的1x1xC特徵圖,再經過兩個全連接神經網絡,最後用一個類似於循環神經網絡中門的機制。通過參數來爲每個特徵通道生成權重,其中參數被學習用來顯式地建模特徵通道間的相關性(論文中使用的是sigmoid)。

在這裏插入圖片描述
如上圖所示,將特徵爲YWCY*W*C的特整圖,經過全局池化後變爲11C1*1*C的特徵,然後將11C1*1*C的特徵縮減爲原來的rr分之一倍,減少全連接層的計算量,網絡經過ReLU激活函數後,再次經過第二個全連接層將特徵從11C/r1*1*C/r再擴充爲11C1*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等等。

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