卷積神經網路學習路線(二十) | Google ICCV 2019 MobileNet V3

  • 2020 年 2 月 21 日
  • 筆記

前言

MobileNetV3是Google繼MobileNet V1和MobileNet V2後的新作,主要使用了網路搜索演算法(用NAS通過優化每個網路塊來搜索全局網路結構,用NetAdapt演算法搜索每個層的濾波器數量),同時在MobileNet V2網路結構基礎上進行改進,並引入了SE模組(我們已經講過了SENet,【cv中的Attention機制】最簡單最易實現的SE模組)和提出了H-Swish激活函數。論文原文見附錄。

關鍵點

1. 引入SE模組

下面的Figure3表示了MobileNet V2 Bottleneck的原始網路結構,然後Figure4表示在MobileNet V2 Bottleneck的基礎上添加了一個SE模組。因為SE結構會消耗一定的時間,SE瓶頸的大小與卷積瓶頸的大小有關,我們將它們全部替換為固定為膨脹層通道數的1/4。這樣做可以在適當增加參數數量的情況下提高精度,並且沒有明顯的延遲成本。並且SE模組被放在了Depthwise卷積後面。

在這裡插入圖片描述

2. 更改網路末端計算量大的層

MobileNetV2的inverted bottleneck結構是使用了1*1卷積作為最後一層,以擴展到高維度的特徵空間(也就是下圖中的320->1280那一層的1*1卷積)。這一層的計算量是比較大的。MobileNetV3為了減少延遲並保留高維特性,將該1*1層移到最終的平均池化之後(960->Avg Pool->1*1 Conv)。現在計算的最後一組特徵圖從7*7變成了1*1,可以大幅度減少計算量。最後再去掉了Inverted Bottleneck中的Depthwise和1*1降維的層,在保證精度的情況下大概降低了15%的運行時間。

在這裡插入圖片描述

3. 更改初始卷積核的個數

修改網路頭部卷積核通道數的數量,Mobilenet v2中使用的是,作者發現,其實可以再降低一點,所以這裡改成了,在保證了精度的前提下,降低了的速度。

4. H-Swish 激活函數

Mobilenet V3引入了新的非線性激活函數:H-Wwish。它是最近的Swish非線性函數的改進版本,計算速度比Swish更快(但比ReLU慢),更易於量化,精度上沒有差異。其中Swish激活函數的公式如下:

其中是sigmoid激活函數,而H-Swish的公式如下:

簡單說下,Swish激活函數相對於ReLU來說提高了精度,但因為Sigmoid函數而計算量較大。而H-swish函數將Sigmoid函數替換為分段線性函數,使用的ReLU6在眾多深度學習框架都可以實現,同時在量化時降低了數值的精度損失。下面這張圖提到使用H-Swish在量化的時候可以提升15%的精度,還是比較吸引人的。

在這裡插入圖片描述

5. NAS搜索全局結構和NetAdapt搜索層結構

剛才已經提到MobileNet V3模組是參考了深度可分離卷積,MobileNetV2的具有線性瓶頸的反向殘差結構(the inverted residual with linear bottleneck)以及MnasNe+SE的自動搜索模型。實際上上面的1-4點都是建立在使用NAS和NetAdapt搜索出MobileNet V3的基礎結構結構之上的,自動搜索的演算法我不太了解,感興趣的可以去查看原文或者查閱資料。

網路結構

開頭提到這篇論文提出了2種結構,一種Small,一種Large。結構如Table1和Table2所示:

MobileNet V3-Small網路結構圖可視化結果見推文最後的圖片。

實驗

分類都在ImageNet上面進行測試,並將準確率與各種資源使用度量(如推理時間和乘法加法(MAdds))進行比較。推理時間在GooglePixel-1/2/3系列手機上使用TFLite運行測試,都使用單執行緒大內核。下面的Figure1展示了性能和速度的比較結果。

下面的Figure2是運算量和準確率的比較。

下面的Table3是分類性能和推理速度的比較,而Table4是量化後的結果。

Figure 9展示了不同組件的引入是如何影響了延遲/準確度的。

下面的Table6是在SSDLite中替換Backbone,在MSCOCO數據集上的比較結果。在通道縮減的情況下,MobileNetV3-Large(V3+)比具有幾乎相同mAP值的MobileNetV2快25%。然後在相同的推理速度下,MobileNetV3-Small比MobileNetV2和MnasNet的mAP值高2.4和0.5。

補充

在知乎上看到一個回答,蠻有趣的:

結論

基本上把MobileNet V3除了搜索網路結構的部分說完了,但是似乎這次Google開源的這個V3沒有達到業界的預期吧。並且這篇論文給人的感覺是網路本身和相關的Trick很容易懂,但是具體是怎麼搜索出V3以及預訓練模型未開源這些問題仍會使我們一臉懵。但如果從工程角度來講,畢竟使用簡單,效果好對我們也足夠了。

參考文章

  • 論文原文:https://arxiv.org/pdf/1905.02244.pdf
  • 源碼實現:https://github.com/xiaolai-sqlai/mobilenetv3
  • 參考資料1:https://zhuanlan.zhihu.com/p/69315156
  • 參考資料2:http://tongtianta.site/paper/27865

歡迎關注GiantPandaCV, 在這裡你將看到獨家的深度學習分享,堅持原創,每天分享我們學習到的新鮮知識。( • ̀ω•́ )✧