Squeeze-and-Excitation Networks服務器
SE-net 來自於Momenta 孫剛團隊網絡
SE的設計思路:ide
從卷積操做的實際做用來考慮,conv 把局部空間信息和通道信息組合起來,組合以後造成FM上的值,以前大部分都是空間上作的。函數
對channel考慮的少,可是卷積自己就能夠學到通道之間的組織信息,爲何還要在從新學一遍呢?性能
那思考densenet顯式鏈接各層,resnet能夠連到,DN爲什麼要再連一次?學習
咱們指望特徵學習能力,可是須要顯式建模來幫助學習測試
1 SE-net的靈感google
VGG 網絡將 Alexnet 7*7 和 5*5 替換成了3*3 的卷積核spa
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