Squeeze-and-Excitation Networks
SENet是Squeeze-and-Excitation Networks的簡稱,拿到了ImageNet2017分類比賽冠軍,其效果得到了認可,其提出的SE模塊思想簡單,易於實現,並且很容易可以加載到現有的網絡模型框架中。SENet主要是學習了channel之間的相關性,篩選出了針對通道的注意力,稍微增加了一點計算量,但是效果比較好。
通過上圖可以理解他的實現過程,通過對卷積的到的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)
雖然核心就是以上的內容,不過不能簡單地結束,我們需要看一下以下幾個點:
-
作為一個重要的attention機制的文章,這篇文章如何描述attention,related work如何組織?
attention機制當時已經有一定的研究和發展,也是集中於序列學習,image captioning, understanding in images這些工作,也已經有很多出色的工作是探索了attention機制。senet這篇文章主要探索了通過對通道間關系進行建模來提升模型的表達能力。related work 主要從更深的網絡架構,架構搜索,注意力機制三個角度進行了梳理,確實非常全面。
-
如何解釋SE模塊?
Sequeeze 對C×H×W 進行global average pooling,得到 1×1×C 大小的特征圖,這個特征圖可以理解為具有全局感受野。
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層的內容,如下圖所示:
可以看出這兩個類激活出來的內容有一定的差距,起到了一定的作用。
可以看出SE模塊確實是有很大的作用,並且其實現起來比較簡單,易於集成,對於分類問題來講自然是效果很好,針對目標檢測問題的時候,有人反映可能結果並不是特別如意,如果隨意的添加SE模塊可能並不能很好地提升模型的性能。添加SE模塊能提升大目標的檢測效果,但是對小目標檢測效果有不利影響,所以可以進行實驗,然后決定是否使用該模塊。