MobileNet V1 V2


MobileNetV1

paper https://arxiv.org/abs/1704.04861

MobileNet 由谷歌在 2017 年提出,是一款專注於在移動設備和嵌入式設備上的 輕量級 CNN神經網絡,並 迅速 衍生了 v1 v2 v3 三個版本;

相比於傳統的 CNN 網絡,在准確率小幅降低的前提下,大大減小模型參數和運算量;

 

一句話概括,V1 就是 把 vgg 中標准卷積層 換成了 深度可分離卷積;

模型亮點:

1. 深度可分離卷積,大大減少參數量

2. 增加超參 α、β 

 

可分離卷積

可分離卷積大致可以分為 空間可分離 和 深度可分離

 

空間可分離

顧名思義,就是把一個 大卷積核 換成兩個 小卷積核,例如;

非本文重點,簡單介紹;

 

深度可分離

深度可分離 由 深度卷積 + 逐點卷積 組成;

深度卷積:論文中稱為 DW 卷積,就是 把 卷積核 變成 單通道,輸入有 M 個通道數,就需要 M 個卷積核,每個通道 分別進行卷積,最后做疊加,如下圖

 

逐點卷積:論文中稱為 PW 卷積,就是用 1x1 的卷積核進行卷積,作用是 對深度卷積后的 特征 進行 升維;

 

上面兩步實現的效果如下圖

可以看到輸出 的 shape 是一樣的;

下面我們看看在 輸入輸出 shape 一樣時各自的參數量

標准卷積

params:Dk x Dk x M x N

計算量:Dk x Dk x M x Dh x Dw x N

可分離卷積

params:Dk x Dk x M + M x N

計算量:Dk x Dk x M x Dh x Dw + M x Dh x Dw x N

計算一下減少量

N 為 輸出通道數, Dk 為 卷積核 size,如果 size 為 3,減小了 1/9 左右,厲害了;

 

V1 卷積結構

把 vgg 的標准卷積 和 V1 的深度可分離卷積 對比看下

看到了 深度卷積 (3x3 Depthwise)和逐點卷積 (1x1 conv);

同時看到了 Relu6,什么鬼?

 

Relu6 

上圖,一看便知

Relu6 對 大於 0 的部分做了一個邊界,作者認為,在模型精度要求不是很高的情況下,邊界使得模型魯棒性更強;

強行壓縮數值比較大的特征,避免了 個性特征,也相當於 規范了特征,防止過擬合,玄學要自己體會;

 

V1 網絡結構

說了那么多,該上結果了

Conv 代表標准卷積,Conv dw 代表深度可分離卷積,s2 代表步長為2,s1 代表步長為1; 

 

V1 模型效果 

標准卷積是在 原特征 上進行多次卷積,而 深度可分離卷積 是在 卷積后的 特征上 進行 多次卷積,直觀的感覺是,后者提取的特征不如前者,性能應該差點;

為了驗證 V1 的效果,作者做了各種實驗;

1. 分別用 標准卷積 和 深度可分離卷積 實現 MobileNetV1

可以看到 效果確實不如 標准卷積,但是 ACC 相差不大, 可喜的是 參數量和計算量 大大降低,約 1/9;

2. 把 V1 和 其他經典網絡比較

ACC 優於 GoogleNet,差於 VGG16,但相差都不太大,但是參數量和計算量大大降低;

3. 把 V1 用於 目標檢測算法

mAP 相差不是特別大,計算量大大降低; 

總結一句話,就是 V1 效果不輸其他網絡,但計算量和參數量大大降低

 

超參數對比

 

缺點

使用中發現, depthwise 部分的卷積核很容易廢掉,即卷積核參數大部分為 0;

MobileNetV2 對此進行了分析和優化;

 

MobileNetV2

paper https://arxiv.org/abs/1801.04381

MobileNetV2 是由 谷歌 在 2018 年提出,相比 V1,准確率更好,模型更小;

 

模型亮點:

1. Inverted Residuals(倒殘差結構)

2. Linear bottlenecks

 

倒殘差結構

一看到 殘差,就想到 resnet 了,先來看看 resnet 的 residual block

我們看右邊的 block,在 resnet 中 這個 block 專為 深層網絡設計,可大大減少 參數量;它先 通過 1x1 把 256 channel 變成 64  做降維,然后是 3x3 conv,再接着 1x1 還原為 256 channel 做升維;

總結一句就是先降維再升維,兩頭胖,中間瘦;

而 倒殘差結構就是 兩頭瘦,中間胖;

如下圖

 

在具體網絡設計時,經過試驗,作者並不是把 所有 block 都加上了 殘差結構,所以 V2 中有兩種 block;

只有 Stride=1 時,才有 殘差結構; 

 

Linear bottlenecks

我們看到上面的 殘差結構 末尾 是 Linear 而不是 Relu,為什么呢?

作者經過研究,發現在 V1 中 depthwise 中有 0 卷積的原因就是 Relu 造成的,換成 Linear 解決了這個問題;

 

Relu 為什么被換掉

作者做了如下實驗

作者把一個 二維 流形 數據【圖1】 作為 輸入, 然后 用不同維度的矩陣 T 把它映射到 高維,然后經過 Relu 輸出,再把 輸出 經過 T-1 還原成  二維,發現,在 低維 【圖2 3】 時,Relu 對信號的損失非常大,隨着維度增加,損失越來越小;

結論就是 Relu 對低維信號 損失很大

回想一下 深度卷積,深度卷積是單通道卷積,只有 1 維,經過 relu 后,即使是 融合后再  Relu 也只有 3 維,信號損失很大,如果學到的信號完全沒有用,那就不用學了, w 自然是 0

 

問題又來了,既然 depthwise 時 relue 造成了信號損失,為什么不換 DW 的 relue,而是把 逐點卷積 的 激活函數 換成 Linear 了?

1. 首先 dw 的 relu 造成 大量損失是因為 Input 的 channel 太少了,如果 Input 的 channel 不少呢,就不損失了,那就沒問題了,所以重點不是換不換 relue,是解決 低 channel 的問題;

2. 既然 channel 少,我給你增加 channel 不就好了,就是 1x1 升維咯;

3. 升完了,我再降回來,將回來之后, channel 就少了,那就換成 linear 咯;

4. 於是 倒殘差結構 形成咯,再就是畫道線的事,參考 resnet 而已;

 

V2 網絡結構

 

V2 模型效果

 

一句話,又好又快 

 

 

 

參考資料:

https://zhuanlan.zhihu.com/p/70703846


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM