簡介:
Squeeze-and-Excitation Networks(以下簡稱 SENet)是一種類似於 plugin 的概念,
獲得對於 C 個特徵(frature)間的關係,進而提升整體模型的準確率。
方法概要:
Step1
先拿一組 H’ x W’ x C’ 的 feature ,經過 Ftr 後 得到標準輸入 U 。
Step2
想像一下把 U 這顆像生吐司的東西整個壓縮,經過 Fsq 後 變成 1 x 1 x C 的濃縮生吐司資料。
然後這裡做了 channel-wise 的運算,也就是分組 base on C 的概念。
做了以後會得到 C 組的 1 x 1 資料
channel-wise 的概念請點這篇
Step3
因為濃縮生吐司資料的尺寸是 1 x 1 x C ,所以可以想像成有 C 片小土司。
為了減少計算量 + 得到每片吐司 裡面模型的互相關係,所以做 Fex。
得到權重序列 S (1 x 1 x C)
其中 W1,W2 的維度變換是因為 Activation Function 的緣故。
Step4
把權重序列 S 乘上生吐司 U (標準輸入 feature),
讓你的生吐司成為威力加強版!
想像一下,如果拿去做二維邊緣偵測,經過這個 SENet 之後的輪廓理論上會加深。
解釋計算方程式:
Ftr():
Ftr 就是在做捲積運算,算到想要到生吐司尺寸。
Faq():
Zc 就是上文所提到的濃縮生吐司資料,這邊在幹的事情很簡單。
把 H x W 這個二維平面上的每一個點做平均得到一個純量,總共有 C 個純量。
正經且學術上的講法是 Global Average Pooling
Fex():
Fex() 是本文核心重點,利用 Fex() 獲得 Channel feature map 間的關係。
首先要說明 σ 跟 δ 的特殊性關係(#
σ = sigmoid ; δ = ReLU
z 則是等效上面的 Zc
從右邊看起 維度 C 的 濃縮生吐司資料 左乘 W1 出來的資料維度是 1 x 1 x C/r ,
這筆資料做 Sigmoid 後 左乘 W2 又變回 1 x 1 x C 的資料。
最後 ReLU 運算後,得到權重序列 S 。
Fscale():
核心概念概念就是把這串權重序列 S 分配給傻傻的並聯生吐司 U,
文章的 Reference 來自於這兩篇:
(深度學習)SENet(Squeeze-and-Excitation Networks)
SENet(Squeeze-and-Excitation Networks)算法笔记
如果小弟我有寫錯,或是有更好的想法歡迎來信討論~
信箱地址:wuyiulin@gmail.com