MobilenetV2學習筆記 --- MobileNetV2: Inverted Residuals and Linear Bottlenecks

論文:https://arxiv.org/abs/1801.04381
代碼:https://github.com/tonylins/pytorch-mobilenet-v2

此外給出MobilenetV1論文鏈接:https://arxiv.org/abs/1704.04861
沒有看過MobilenetV1的建議先去看看。

MobilenetV1

利用深度可分離卷積代替標準卷積,大大減少了模型計算量。
基本思想:將標準卷積拆分爲兩個分卷積:第一層稱爲深度卷積(depthwise convolution),對每個輸入通道應用單通道的輕量級濾波器;第二層稱爲逐點卷積(pointwise convolution),負責計算輸入通道的線性組合構建新的特徵。
深度可分離卷積對比標準卷積的參數量計算請看:https://blog.csdn.net/c2250645962/article/details/102625943
兩者計算量比較結果如下:

在這裏插入圖片描述
K - 卷積核尺寸
C_out - 輸出通道數

MobilenetV2是基於MobilenetV1改進而來的。MobileNetV2中使用的卷積核大小k=3,與標準卷積相比計算量減少了8~9倍。

MobileNetV2

創新點

  • Linear Bottlenecks

bottleneck 的最後一個 1x1 conv 層,把ReLU函數替換爲Linear 線性函數,以防止ReLU破壞特徵。如下圖
在這裏插入圖片描述
圖中的ReLU6指的是ReLU6就是普通的ReLU但是限制最大輸出值爲6(對輸出值做clip)。

該創新點主要是與MobilenetV1進行比較得來的。
MobilenetV2在DW層之前添加多一個PW層,這樣做的原因是 DW 卷積由於本身的計算特性決定它自己沒有改變通道數的能力,上一層給它多少通道,它就只能輸出多少通道。那麼如果輸入通道數很少的話,DW就只能對很少的通道數進行操作,這樣回限制後面抽取的特徵性能。爲了解決這個問題,MobilenetV2在DW前添加PW層,目的是爲了提升通道數,獲得更多特徵。

此外,作者根據實驗認爲,激活函數在高維空間能夠有效的增加非線性,而在低維空間時則會破壞特徵,不如線性的效果好。由於深度可分離卷積的第二個pointwise convolution操作主要是降維,所以降維之後就不宜用ReLU了。

  • Inverted residuals

傳統的residual 加shortcut,目的是:提高梯度跨層傳播的能力。而反向設計大大提高了內存效率。

在這裏插入圖片描述
圖中帶有對角斜線的層沒有使用非線性(與第一個創新點對應),用厚度來表示每個block的輸入通道。
由圖可以看到,傳統的residual block輸入通道數是比較大的,然後將數據降維(1 * 1卷積),在經過3 * 3 標準卷積抽取特徵,最後將數據升維(1*1卷積),即輸入特徵 -> 壓縮 -> 提特徵 -> 擴張

然而,Inverted residual block是輸入通道數很少,然後將數據擴張(1 * 1卷積),在經過3 * 3 DW卷積抽取特徵,最後使用1 *1 PW卷積將數據壓縮,即輸入特徵 -> 擴張 ->提特徵 -> 壓縮
這個過程剛好和residual相反,所以叫inverted residual (倒置殘差塊)。
這麼做也是因爲.DW 層提取得到的特徵受限於輸入的通道數,如果使用傳統的residual方法,那麼可提取的特徵就太少了,作者希望特徵提取能夠在高維進行。

網絡結構

綜上,那麼MobilenetV2的Bottleneck residual block tablet如下,也對應了輸入特徵 -> 擴張 ->提特徵 -> 壓縮Bottleneck最後激活函數改爲Linear
在這裏插入圖片描述
t - 擴展因子,h * w - 輸入feature map尺寸, k - 輸入通道數。

MobilenetV2完整的網絡結構如下:
在這裏插入圖片描述
其中:t表示“擴張”倍數,c表示輸出通道數,n表示重複次數,s表示步長stride。

初始的全卷積爲32個卷積核,後面接了17個 residual bottleneck(文中提到共計採用19個bottleneck,但是這裏只有17個)。bottleneck採用ReLU6作爲激活函數。選擇擴展因子(expansion factor)等於6,例如採用64的通道的輸入張量產生128通道的輸出,則中間的深度卷積的通道數爲6×64=384

此外,除了最後的avgpool,整個網絡並沒有採用pooling進行下采樣,而是利用stride=2來下采樣,這一點與Darknet53 一樣的,至於原因?我猜是爲了獲取更多特徵,pooling會有較大的信息損失。
特別的,對於stride=1stride=2,他們的bottleneck結構是不一樣的,如下:

在這裏插入圖片描述
區別在於stride=2的時候沒有shortcut連接,原因是stride=2的時候前後feature map尺寸不一樣了,是爲了維度匹配。

https://zhuanlan.zhihu.com/p/33075914
https://blog.csdn.net/u011995719/article/details/79135818
https://blog.csdn.net/u012505617/article/details/90511966
https://blog.csdn.net/u011974639/article/details/79199588

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