MobileNet、GhostNet理解及测试
??MobileNet由谷歌于2017年提出,它是一種能夠用在端側設備上的輕量級網絡。GhostNet是華為諾亞實驗室開發的一款輕量級網絡,論文發表在CVPR2020。我認為學習論文還是要實際跑一跑代碼,這樣才能有更深入的體會和理解,本文首先簡介兩個網絡的原理,然后在cifar10上進行對比試驗,并展開一定的討論分析。畢竟個人水平有限,資源也有限試驗開展的不夠充分,所以理解不正確的地方還請批評指正。
MobileNet論文:https://arxiv.org/abs/1704.04861
MobileNet代碼:https://github.com/Zehaos/MobileNet
GhostNet論文:https://arxiv.org/abs/1911.11907
GhostNet代碼:https://github.com/huawei-noah/ghostnet
文章目錄
- 一、主要原理
- 1.MobileNet的深度可分離卷積
- 2.GhostNet的幻影模塊
- 二、cifar10數據試驗
- 1.試驗說明
- 2.試驗結果
- 3.結果分析
- 三、討論
一、主要原理
1.MobileNet的深度可分離卷積
??MobileNet的核心是深度可分離卷積,就是把普通卷積操作分成兩步:第一步稱為Depthwise卷積,先對各通道進行單通道的卷積,每次輸出也是單通道的特征圖,再合并起來得到和輸入通道數相同的特征圖,這個操作比原操作大大降低了參數量和計算量(FLOPs,浮點運算數,即加法和乘法的次數),但是它沒有結合各通道間的信息,所以還要第二步;第二步稱為Pointwise卷積,對第一步輸出的特征圖進行1×1卷積,進行通道信息混合后按需要的通道數輸出。
??普通卷積的參數量是:k2×Cin×Coutk^2×C_{in}×C_{out}k2×Cin?×Cout?
??普通卷積的FLOPs是:2k2×Cin×Cout×Hout×Wout2k^2×C_{in}×C_{out}×H_{out}×W_{out}2k2×Cin?×Cout?×Hout?×Wout?
??可分離卷積的參數量是:k2×Cin+Cin×Coutk^2×C_{in} + C_{in}×C_{out}k2×Cin?+Cin?×Cout?
??可分離卷積的FLOPs是:2k2×Cin×Hout×Wout+2Cin×Cout×Hout×Wout2k^2×C_{in}×H_{out}×W_{out} + 2C_{in}×C_{out}×H_{out}×W_{out}2k2×Cin?×Hout?×Wout?+2Cin?×Cout?×Hout?×Wout?
??通常中間層的通道數和特征圖尺寸數都較大,可分離卷積的參數量和計算量主要集中在第二步1×1卷積部分,與比較常用的3×3卷積的普通卷積相比,它的參數量核計算量只有1/9。
2.GhostNet的幻影模塊
??GhostNet的核心是提出了GhostModule,我們暫且稱為幻影模塊,幻影模塊也是把普通卷積分為兩步:作者認為普通卷積生成的特征圖中有大量冗余,所以第一步用原卷積運算先生成少部分通道數的特征圖;第二步再用“廉價運算”Cheap Operation對第一步生成的特征圖再簡單運算生成更多的特征,把兩步生成的特征圖cat合并得到和原來普通卷積同樣尺寸的特征圖。所謂的廉價運算,就是指的單通道分組卷積,和Depthwise卷積差不多。參數量和計算量主要集中在第一步,第一步生成的通道數和原卷積通道數的比例被稱為壓縮比,如果壓縮比為2,則參數量和計算量就大約是原卷積參數量和計算量的1/2,考慮到精度影響,根據作者的試驗數據,壓縮比以2為佳,不宜超過4。
??由于MobileNet的深度可分離卷積通常可以實現1/9左右的壓縮,所以如果僅把普通卷積替換為幻影模塊,壓縮量還不如MobileNet。看作者的開源代碼,如果我理解沒錯的話,實際上是對MobileNet的1×1卷積Pointwise部分再替換為幻影模塊,也就是說在壓縮基礎上再壓縮。
二、cifar10數據試驗
1.試驗說明
??由于cifar10的圖片尺寸是32×32的,運算速度特別快,我卡只一個,人只一枚,所以就在cifar10上做一些對比試驗。訓練的時候沒有使用各種tricks,比如數據增廣、學習率調整等等,所以訓練遠未充分,我的主要目的是通過實際跑代碼深入學習理解兩個網絡,并不作為測評對比指標。
使用的網絡如下表:
| VGG16 開源 | 把VGG16的卷積替換為深度可分離卷積 | 替換為Ghost模塊 |
| ResNet34 | ResNet34(DW-PW) | ResNet34(Ghost) |
| ResNet34開源 | 把ResNet34的非1×1卷積替換為深度可分離卷積 | 替換為Ghost模塊 |
| GhostNet | GhostNet(DW-PW) | GhostNet(Conv) |
| GhostNet開源代碼 | 把GhostNet的GhostModule替換為深度可分離卷積 | 替換為普通卷積 |
試驗配置:
數據:cifar10, 訓練集50000張32×32×3圖片,測試集10000張32×32×3圖片,10類。
訓練:Adam(lr=0.01),batch_size=512, epoch=50, GPU: 2080Ti×1
2.試驗結果
其中參數量和FLOPs僅指所有卷積層的,計算方法和代碼參見我之前的博客:https://blog.csdn.net/Brikie/article/details/112646865
由于訓練不充分,精度比文獻給出的值低不少。
| VGG16 | 14.7M | 626M | 10.6s | 1.68s | 5.9ms | 4.8G | 83.9 |
| VGG16(DW-PW) | 1.68M | 72.9M | 8.03s | 1.59s | 3.3ms | 3.6G | 82.1 |
| VGG16(Ghost) | 877K | 40.6M | 9.97s | 1.62s | 5.9ms | 3.9G | 82.0 |
| ResNet34 | 21.26M | 2.32G | 27.7s | 2.66s | 4.7ms | 6.5GB | 84.3 |
| ResNet34(DW-PW) | 2.58M | 283M | 24.0s | 2.37s | 7.2ms | 9.5GB | 85.4 |
| ResNet34(Ghost) | 1.44M | 163M | 32.3s | 2.92s | 4.8ms | 10.5GB | 84.8 |
| GhostNet(Conv) | 19.1M | 80.7M | 6.41s | 1.48s | 7.0ms | 5.1GB | 75.6 |
| GhostNet(DW-PW) | 4.81M | 15.3M | 6.38s | 1.44s | 9.5ms | 5.9GB | 75.3 |
| GhostNet | 3.88M | 11.0M | 6.99s | 1.49s | 13.3ms | 5.0GB | 74.2 |
3.結果分析
(1)能夠明顯觀察到使用深度可分離卷積以及使用Ghost模塊后,參數量和浮點運算量都會明顯下降。
(2)但是觀察訓練速度、推理速度以及顯存占用都沒有明顯下降甚至還有上升。我認為這可能是電腦GPU上的CUDA沒有專門針對可分離卷積以及Ghost模塊進行優化導致的,因為加入可分離卷積或Ghost模塊后雖然參數量下降,但是卷積層數變多,這導致串行運算更多,沒有專門優化的時候速度反而會下降。顯存為什么會變多我沒有弄清楚。但可以肯定的是這些輕量級網絡在端側設備應用時還必須有專門的優化才能發揮其性能。
(3)深度可分離卷積和幻影模塊加入后訓練精度沒有明顯降低,甚至還有提高,和論文結論不一致,可能是訓練不夠充分沒能觀察到最終的結果。
三、討論
下面的一些討論涉及的試驗數據不再給出,僅給出結論。
1,深度可分離卷積中為什么先DW后PW,反過來會怎樣?
反過來也是可以的,效果沒有太大的區別。
2,Ghost模塊中的cheap特征畢竟是用簡單運算生成的,我們想知道是否它們是必要的?如果我們直接用無參數的線性變換生成cheap特征會怎樣?如果去掉它們會怎樣?
試驗發現cheap特征是有用的,使用全部置零的方式放棄這部分特征會降低精度。如果使用固定的線性變換生成cheap特征,即不使用含可學習參數的卷積運算也會導致精度降低。所以這些特征是必要的。
總結
以上是生活随笔為你收集整理的MobileNet、GhostNet理解及测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeNet试验(一) 搭建pytorch
- 下一篇: LeNet试验(四)使用shuffle