SE net:Squeeze-and-Excitation Networks論文解讀

近期對有關注意力機制的兩篇文章進行了解讀。分別是可以嵌入到很多網絡結構中去的SE block的提出論文SENet,以及在GAN生成領域引入注意力機制的SAGAN。這兩篇文章都是很經典的文章,這裏將其詳細整理一下。

SE Net:Squeeze-and-Excitation Networks (CVPR2018)

    這篇文章的主要貢獻是對通道間的依賴關係、各通道特徵的權重進行了學習和分配。

    卷積神經網絡(CNN)的核心構件是卷積運算符,它使網絡在每一層的局部接受域內融合空間和通道信息構造信息特徵。很多現有的研究都試圖通過在整個特徵層次上提高空間編碼的質量來增強CNN的特徵表達能力。在SENet中,將重點放在通道間關係上,提出一個新穎的架構單元,“squeeze和excitation”(SE block),通過顯式建模通道(channel)之間的相互依賴性來自適應地重新校準通道特徵的響應。

    SEnet是2017年由Momenta在提出的全新圖像識別結構,它通過對特徵通道間的相關性進行建模,把重要的特徵進行強化來提升準確率。在ILSVRC 2017分類比賽中獲得冠軍,在ImageNet數據集上將top-5 error降低到2.251%,相對於2016年的冠軍有了約25%的提升(2.991%)。

論文:Squeeze-and-Excitation Networks
論文鏈接:https://arxiv.org/abs/1709.01507
作者Caffe代碼地址:https://github.com/hujie-frank/SENet
PyTorch代碼地址:https://github.com/miraclewkf/SENet-PyTorch

(1)、主要原理和結構
   分Squeeze和excitation兩塊兒。SE block的結構圖如下,

其中,Ftr爲傳統的卷積特徵提取結構,X和U爲其輸入和輸出,。計算公式爲,

                                                                 

這與之前的卷積結構相同,SE block增加的在後面階段。Squeeze操作即Fsq,目的是爲了在後面的全連接層處理之前,先對全局信息進行一個融合,實際上是做了一個Global Average Pooling操作(在pytroch中,對U的W和H做平均池化;在Ttensorflow中有兩種實現方式,分別爲直接使用tf.reduce_mean()和使用 from tflearn.layers.conv import global_avg_pool,直接用global_avg_pool)。全局平均池化得到1*1*C的數據。隨後進行excitation操作,包括FC(1*1*C/r,不使用bias)--> ReLu -->FC(1*1*C,不使用bias) --> Sigmoid。使用Sigmoid將特徵值限制在[0,1]範圍內。最後Scale後的值與特徵U中C個通道分別相乘,作爲下一級輸入。通過網絡對Scale值的學習,增強重要特徵,減弱不重要特徵,使得提取的特徵指向性更強。

下面是pytorch版本的SE block實現代碼:

from torch import nn


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)

下面是tensorfow版本的SE block實現代碼:

import tensorflow as tf
import tensorflow.contrib.slim as slim
from tflearn.layers.conv import global_avg_pool
  
def relu(x, name='relu'):
    return tf.nn.relu(x)
def sigmoid(x):
    return tf.nn.sigmoid(x)

def global_average_pooling(x):
    return global_avg_pool(x)
    # return tf.reduce_mean(x)

def FC_layer(x,dim,name):
    # SE Net中指出,在excitation過程中的FC層不使用bias更有利於通道依賴關係的建模
    return tf.layers.dense(inputs=x, use_bias=False, units=dim,name = name)

def se_block(input_x,out_dim,redution, name):
    x = global_average_pooling(input_x)
    x = FC_layer(x,out_dim/redution,name = name + '_FC1')
    x = relu(x)
    x = FC_layer(x,out_dim,name = name+'_FC2')
    x = sigmoid(x)
    scale = tf.reshape(x,[-1,1,1,out_dim])
    return input_x * scale

在Squeeze部分Global Average Pooling中,作者使用最簡單的求哦平均,將每個通道中所有點的信息平均成一個值。公式爲

                                                        

之所以這樣操作(以下部分內容借鑑自:https://zhuanlan.zhihu.com/p/32702350),(1)因爲最終的scale是對整個通道作用的,這就得基於通道的整體信息來計算scale。(2)另外作者要利用的是通道間的相關性,而不是空間分佈中的相關性,用GAP屏蔽掉空間上的分佈信息能讓scale的計算更加準確

Excitation操作中,第一個FC全連接層首先將U的C個通道壓縮爲C/r個通道,文中使用r爲16,來降低計算量。經Relu來激活,第二個全連接恢復爲C個通道,後接sigmoid。作者對r的值進行了嘗試,最終確定爲16,此時整體分類準確率和計算量最平衡。加入FC層的主要爲了利用通道間的相關性來訓練出真正的scale。一次mini-batch個樣本的squeeze輸出並不代表通道真實要調整的scale值,真實的scale要基於全部數據集來訓練得出,而不是基於單個batch,所以後面要加個全連接層來進行訓練。

將SE Block和下面3種錯誤的結構比較來進一步理解:
① 若將squeeze的輸出直接scale到輸入上,沒有全連接層,某個通道的調整值完全基於單個通道GAP的結果,事實上只有GAP的分支是完全沒有反向計算、沒有訓練的過程的,就無法基於全部數據集來訓練得出通道增強、減弱的規律。

                                          
②  只採用經典的卷積結構,有人會說卷積訓練出的權值就含有了scale的成分在裏面,也利用了通道間的相關性,爲啥還要多個SE Block?那是因爲這種卷積有空間的成分在裏面,爲了排除空間上的干擾就得先用GAP壓縮成一個點後再作卷積,壓縮後因爲沒有了Height、Width的成分,這種卷積就是全連接了

                                               
③ SE模塊和傳統的卷積間採用並聯而不是串聯的方式,這時SE利用的是Ftr輸入X的相關性來計算scale,X和U的相關性是不同的,把根據X的相關性計算出的scale應用到U上明顯不合適。

                                                    

 

(2)SE block經典嵌入結構

      作者給出了兩中嵌入結構,分別將SE block應到用Inception和ResNet結構中去。

在經典ResNet50中,SE block嵌入具體如下,

        在原有結構中加入SE block,對FLOPs計算量會有增加。在ImageNet上進行實驗,結果如下,在增量計算量允許的情況下,對性能有不小的提升。

  

(3)實驗驗證部分

       在這一部分,作者做了很多實驗,對以後自己做實驗也有一定的指導意義,清楚從哪幾個方面對論點進行論證。

       ① 在壓縮模型網絡上進行了實驗,證明SE block的泛化性。

      ②  對於圖像分類任務,以多種SOTA網絡爲基礎,嵌入SE block,證明其泛化性。

           分別在ImageNet,Cifar-10,Cifar-100等經典分類數據集上做了實驗。

           

           ③ 在場景理解分類數據集上進行測試,證明SE block泛化性和處理抽象問題的能力。

               使用的數據集爲Places365。這樣做的主要原因爲,場景理解一般需要模型考慮更多/更復雜的數據練習,對較大程度的外觀變化保持魯棒性。

                                                 

                ④ 在COCO目標檢測數據集上進行實驗,證明SE block的泛化性。

                                             

 

(4)消融實驗

    這部分的消融實驗思路也值得我們學習。消融實驗部分,對很多超參數的確定都進行了說明,提供了實驗依據。

        ① 對Excitation中的 Reduction ratio比例的確定。

             設置r = 16可以在精度和複雜度之間取得良好的平衡。 實際上,在整個網絡中使用相同的比率可能不是最佳的(由於不同層執行不同的角色),因此可以調整每個stage的ratio比率是後續的改進方向。

                                               

            ② 對Squeeze Operator的消融實驗

              在Squeeze操作中,對全局信息的處理,除了全局平均池化,也可以考慮全局最大池化。相比之下,GAP更好。

                                                  

            ③ 對Excitation Operator的消融實驗

                在卷積搭建過程中,常用的激活函數爲Relu。在Excitation操作中,第二個FC後,沒有使用Relu,而是使用Sigmoid。實驗結果如下,表明爲使SE block有效,精心構造excitation非常重要。

                                                            

               ④ 對Different stages的消融實驗

                 通過將SE block一次集成到ResNet-50中,探索了SE block在不同階段的影響。 具體來說,將SE block添加到中間階段:第2階段,第3階段和第4階段。結果表明在網絡中每一個階段引入SE block都會帶來性能優勢。 SE block在不同階段產生的增益是互補的,它們可以有效地組合在一起以進一步增強網絡性能。

                                                

                  ⑤ 對Integration strategy的消融實驗

                       對SE block插入網絡的不同位置做了實驗,如下五種結構,分別爲原始的residual 模塊,標準SE block,SE-PRE block,SE-POST block和SE-Identity block。

  

       最後的實驗結果如下圖所示,其中SE-POST的結果較差,也驗證了在ResNetV2論文中作者指出的,在殘差網絡中,儘量不要破壞恆等映射分支向後的傳遞。SE-PRE,SE-Identity和標準SE塊的性能相似。此實驗表明,如果在分支聚合之前應用SE單元,則SE單元所產生的性能改進對其位置將相當可靠。

                                               

             在上面的實驗中,每個SE塊都放置在residual blcok的結構外部。作者還構造了一種設計變體,將SE塊移動到residual blcok內部,將其直接放置在3×3卷積層之後。由於3×3卷積層具有較少的通道,因此相應的SE block引入的參數數量也減少了。實驗結果表明,與標準SE block相比,SE 3×3變體以較少的參數實現了可比的分類精度。儘管這超出了本文的範圍,但我們預計,通過針對特定體系結構定製SE block使用,可以進一步提高效率。

                                                      

      (5)SE block消融實驗

         ① Squeeze操作的重要性實驗

           Specifically, we remove the pooling operation and replace the two FC layers with corresponding 1 × 1 convolutions with identical channel dimensions in the excitation operator, namely NoSqueeze, where the excitation output maintains the spatial dimensions as input. 去除GAP全局信息的提取。由結果可以看出,使用全局信息具有顯着的意義,在NoSqueeze變體中,不再可以在整個網絡中直接訪問全局嵌入。

                                     

        論文還詳細分析了scale的分佈特點。作者對訓練好的結構用以下4個分類的圖片做測試,每個分類50張圖片,統計SE-ResNet-50在5個不同層級上,excitation輸出的分佈。SE_2_3是按SE_stageID_blockID的方法取名的,縱座標是每個分類50張圖片scale的平均值。這個圖中越往後的圖的層級越靠後,all曲線是全部1000個分類的平均值,用來和4個分類的曲線作比較。

                                              

     可以看出靠前的層級(SE_2_3和SE_3_4)各個分類的曲線差異不大,這說明了在較低的層級中scale的分佈和輸入的類別無關隨着層級的加深,不同類別的曲線開始出現了差別(SE_4_6和SE_5_1),這說明靠後的層級的scale大小和輸入的類別強相關;到了SE_5_2後幾乎所有的scale都飽和,輸出爲1,只有一個通道爲0;而最後一層SE_5_3的通道的scale基本相同。最後兩層的scale因爲基本都相等,就沒有什麼用處了,爲了節省計算量可以把它們去掉。

       總結,這篇文章除了提出了SE block可以用於多個網絡、多種任務,在實驗部分也較好的將實驗做的很充分。總而言之,SENet將重要通道的特徵強化,非重要通道的特徵弱化,這種思路可以在很多方面得以應用。

       

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