Squeeze Excitation Module 對網絡的改進分析


  Squeeze-and-Excitation Networks

  SE-net 來自於Momenta 孫剛團隊

  SE的設計思路:

    從卷積操作的實際作用來考慮,conv 把局部空間信息和通道信息組合起來,組合之后形成FM上的值,之前大部分都是空間上做的。

    對channel考慮的少,但是卷積本身就可以學到通道之間的組織信息,為什么還要在重新學一遍呢?

    那思考densenet顯式連接各層,resnet可以連到,DN為何要再連一次?

    我們期望特征學習能力,但是需要顯式建模來幫助學習

    

  1 SE-net的靈感

  VGG 網絡將 Alexnet 7*7 和 5*5  替換成了3*3 的卷積核

  Wide Resnet如下右:

  

 

   除此之外,GoogleNet 內部inxeption 實際使用的是一個多尺度 的結構。

  googlenet 是將卷積在空間維度上進行組合

  ResNeXt 是將左邊的分支結構極端化,在不同的通道上進行group conversation,最后concat

 

  我們希望conv filter 可以在local receptive fields的基礎上 融合 channel-wise 和 spatial 的信息作融合。

  

  下圖左邊inception將卷積核在空間上進行了組合,右圖inside-outsideNetwork 將不同方向的卷積在空間上組合到了一起

  

  

  2 Squeeze-and-Excitation Networks

  網絡是否可以在通道關系方面做增強呢?

  動機:

  對於通道內部依賴做了顯示的建模,選擇強化有用的特征,抑制無用的特征

  

  SE module 結構:

  Ftr:X到U的卷積過程 ,但是通道之間的關系並沒有發生變化:

  Fsq:將每個通道做了一個squeeze操作,將每個通道表示成了一個標量,得到per channel的描述

  Fex:將per channel標量進行“激活”,可以理解為算出了per channel的W

  最后將per channel的W乘回到原來的feature map上得到加權后的channel,將channel 做了恰當的融合

  SE-Module 可以用於網絡的任意階段

  squeeze 操作保證了,在網絡的早期感受野就可以大到全圖的范圍。

  

  SE-inception Module and SE-ResNet Module:

  下圖左邊將Inception Module 轉化成SE 模塊,在此操作中使用squeeze操作是Global polling 操作,也可以使用Global conv 操作,但是考慮到feature map 比較大的時候,G C 的W 也會比較大,所以選擇用pooling,一種max 一種average plooing

  最終選擇的是average pooling,主要的考慮是,如果做檢測任務,輸入FM 大小是變化的,average 基本可以保持能量。如果用max FM 越大,能量不能保持,比如小的FM 求max 和 大的 FM 求 max 在測試時候並不等價。所以選擇average pooling。得到1*1*c的向量。

  后面可以接FC,但是為了減少參數,做了降維操作,增加了一個降維的系數r,輸出 1*1*C/r

  后接RELU,后面在做一個升維操作,得到1*1*C

  最終使用S函數進行激活。

  

   

  可以看到參數量主要取決與FC,在實驗時r一般取16,經驗值!

  右圖中,是resnet module,改造和inception分支很類似。

  Architectures:

  fc[16,256]表示,r 降維系數是16,會先降到16,然后升到256

  在SE-ResNeXt-50中 (32*4d)中,將3*3卷積變成了group卷積,c取32 

  

  模型cost分析:

  1 ,參數量

  2 , 運算速度

  參數量主要來自於在block內部增加的FC,會增加3%-10%的參數量 ,一般是10%,但是在某些情況下,網絡在靠近輸出的情況下

  作者把7*7上的FC SE去掉了,得到總參數占3%,但是在TOP5的精度損失不到1%,非常的Cost-effective

  其他的BN,RELU,POOLING 理論的計算量少。但是全連接對比卷積引起的計算量也很少

  

  理論上計算量增加的計算量不到1%

  實際inference GPU 時間增加了10%,分析原因可能是卷積核頻繁操作, GPU運算不太友好,大size POOling的問題

  CPU 測試和理論分析值接近。

  訓練的情況:

  內部服務器:

  Momenta ROCS

  先對類別進行sample,再對類別內的圖片進行sample,可以確保看到每個類別內圖片概率的都是相同的

   

  組員在之前場景分類用的小技巧,不是對圖像隨機采樣,而是先對類別進行采樣,再在每個特定類別中選去一張圖像

  可以保證數據見到的很平衡的,提高訓練結果。

  訓練超參數:

  任何網絡保證每張卡可以處理32張圖像,batchsize:1024 / 2048.當batch_size 是2048時候,LR可以調到1 

  實驗部分:

  

 

可以看到添加SE以后計算量並沒有增加很多。  

   

紅色是SE

  

  BN-inception 是一個直線型的網絡,沒有skip-connection:(想驗證是否是只能用在skip-layer中)

  

  

    下圖:兩個小FC中的第一個,下采樣的比例選取規則,50層的網路。在1/32的時候,性能還是有些差異,雖然size小了。

     

 

     下圖是實際在參加比賽時,imagenet的結果:

    SE-ResNeXt-152 (64 * 4d)做的改進技巧:

    1:把7*7 拆解成3個3*3連續卷積 (最早在inception中出現)

    2:loss (label_smoothing)

    3: 在訓練的最后幾個epoch,把BN fix住了,正常情況BN需要一起學習。5-10w次

    因為,BN 只跟batch的數據相關,如果BN和其他W一直變的話很難學到一致的程度,fixBN,就可以保證 最后在訓練和測試算出的的均值和方差都是一致的。

    

    

    Excitation的分布結果:

    取得基本都是每個stage最后的layer。在淺層網絡學到的比較commen,share FM,在深層以后可以學到spacial

    

    下圖有意思的是:

    基本大部分線都是1,都是重合的,激活是飽和狀態,個別是0.如果激活所有的值是1的話,其實scale之后沒有任何變化,可以認為就是原始的resnet moudle。 換句話說:這個SE模塊沒有起到任何作用,可以摘除掉

    

    不同類別的激活基本都是相同的,只是浮值變化,這些浮值可以通過分類器的scale進行調節,上層+這層的SE起的作用不大,因為趨勢相同,可能會退化成標准網絡

    結果把最后一個SE模塊摘掉對整體影響不大。

 

  比賽結果:

    

  SE網絡在Mob和Shufflenet中進行實驗:在mobilenet上有3%的提升在shuffle上2%的提升,size 多一點點。

  

    

  場景分類上的結果:

    加了SE之后發現,顯著超過之前的結果:

  

  FAQ

    在不把SEfix的情況下有多大的收益?

    只是競賽的時候做了fix,追求極致的結果/

     每一個通道求一個權值,逐通道的乘上去,設計方式在性能和精度trade off 

    W*H*C 如何映射到C維向量上?

    map 均值對每個feature map

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM