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
