天天看點

attention機制_【CV中的Attention機制】SENet中的SE子產品

attention機制_【CV中的Attention機制】SENet中的SE子產品

1. Squeeze-and-Excitation Network

SENet是Squeeze-and-Excitation Networks的簡稱,拿到了ImageNet2017分類比賽冠軍,其效果得到了認可,其提出的SE子產品思想簡單,易于實作,并且很容易可以加載到現有的網絡模型架構中。SENet主要是學習了channel之間的相關性,篩選出了針對通道的注意力,稍微增加了一點計算量,但是效果比較好。

attention機制_【CV中的Attention機制】SENet中的SE子產品

通過上圖可以了解他的實作過程,通過對卷積的到的feature map進行處理,得到一個和通道數一樣的一維向量作為每個通道的評價分數,然後将改分數分别施加到對應的通道上,得到其結果,就在原有的基礎上隻添加了一個子產品,下邊我們用pytorch實作這個很簡單的子產品。

attention機制_【CV中的Attention機制】SENet中的SE子產品

2. 代碼

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)
           

3. 實驗

雖然核心就是以上的内容,不過不能簡單地結束,我們需要看一下以下幾個點:

  • 作為一個重要的attention機制的文章,這篇文章如何描述attention,related work如何組織?

    attention機制當時已經有一定的研究和發展,也是集中于序列學習,image captioning, understanding in images這些工作,也已經有很多出色的工作是探索了attention機制。senet這篇文章主要探索了通過對通道間關系進行模組化來提升模型的表達能力。related work 主要從更深的網絡架構,架構搜尋,注意力機制三個角度進行了梳理,确實非常全面。

  • 如何解釋SE子產品? Sequeeze :對
    attention機制_【CV中的Attention機制】SENet中的SE子產品
    進行global average pooling,得到
    attention機制_【CV中的Attention機制】SENet中的SE子產品
    大小的特征圖,這個特征圖可以了解為具有全局感受野。 Excitation :使用一個全連接配接神經網絡,對Sequeeze之後的結果做一個非線性變換。 特征重标定 :使用Excitation 得到的結果作為權重,乘到輸入特征上。
  • SE子產品如何加到分類網絡,效果如何?

    分類網絡現在一般都是成一個block一個block,se子產品就可以加到一個block結束的位置,進行一個資訊refine。這裡用了一些STOA的分類模型如:resnet50,resnext50,bn-inception等網絡。通過添加SE子產品,能使模型提升0.5-1.5%,效果還可以,增加的計算量也可以忽略不計。在輕量級網絡MobileNet,ShuffleNet上也進行了實驗,可以提升的點更多一點大概在1.5-2%。

  • SE子產品如何加到目标檢測網絡,效果如何?

    主要還是将SE子產品添加到backbone部分,優化學習到的内容。目标檢測資料集使用的是benchmark MSCOCO, 使用的Faster R-CNN作為目标檢測器,使用backbone從ResNet50替換為SE-ResNet50以後帶了了兩個點的AP提升,确實有效果。

  • 這篇文章的實驗部分是如何設定的?

    這篇文章中也進行了消融實驗,來證明SE子產品的有效性,也說明了設定reduction=16的原因。

    • squeeze方式:僅僅比較了max和avg,發現avg要好一點。
    • excitation方式:使用了ReLU,Tanh,Sigmoid,發現Sigmoid好。
    • stage: resnet50有不同的階段,通過實驗發現,将se施加到所有的階段效果最好。
    • 內建政策:将se放在殘差單元的前部,後部還是平行于殘差單元,最終發現,放到前部比較好。
  • 如何檢視每個通道學到的attention資訊并證明其有效性?

    作者選取了ImageNet中的四個類别進行了一個實驗,測試backbone最後一個SE層的内容,如下圖所示:

attention機制_【CV中的Attention機制】SENet中的SE子產品

可以看出這兩個類激活出來的内容有一定的差距,起到了一定的作用。

4. Reference

論文位址:

https://arxiv.org/abs/1709.01507​arxiv.org

代碼參考位址:

https://github.com/moskomule/senet.pytorch​github.com

核心代碼:

https://github.com/pprp/SimpleCVReproduction/blob/master/attention/SE/senet.py​github.com