輕量級神經網絡:ShuffleNetV1到ShuffleNetV2

論文名:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
論文地址:https://arxiv.org/abs/1707.01083v1
CVPR:2017
論文名:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
論文地址:https://arxiv.org/abs/1807.11164
會議:ECCV2018

大規模的神經網絡和小規模的神經的網絡的之間有什麼區別? 爲什麼有了大規模神經網絡的精度後還要去研究小規模的神經網絡呢?(大網絡:存儲空間,GPU,機房,散熱、成本高)

主要包括三部分:FLOPsPractical GuidelinesShuffleNet V2

摘要

目前,網絡架構設計主要由**計算複雜度的間接度量(如FLOPs)**測量。然而,直接度量(例如,速度)還取決於諸如存儲器訪問成本和平臺特性的其他因素。因此,這項工作建議評估目標平臺上的直接度量,而不僅僅考慮FLOPs。基於一系列對照實驗,這項工作爲高效的網絡設計提供了幾個實用指南。此外,提出了一種稱爲ShuffleNetV2的新架構。利用消融實驗驗證了我們的模型在速度和準確度方面是最好的。

一、FLOPs

在這裏插入圖片描述
FLOPS: 全大寫,指每秒浮點運算次數,可以理解爲計算的速度。是衡量**硬件性能**的一個指標。(硬件)

FLOPs: s小寫,指浮點運算數,理解爲計算量。可以用來衡量**算法/模型**的複雜度。(模型) 在論文中常用GFLOPs(1 GFLOPs = 10^9 FLOPs)

感興趣的可以移步CNN模型所需的計算力(flops)和參數(parameters)數量是怎麼計算的? - 知乎

https://www.zhihu.com/question/65305385

在此推薦一個神器(pytorch):torchstat

https://github.com/Swall0w/torchstat

可以用來計算pytorch構建的網絡的參數,空間大小,MAdd,FLOPs等指標,簡單好用。

比如:我想知道alexnet的網絡的一些參數。

只需要:

from torchstat import stat
import torchvision.models as models

model = model.alexnet()
stat(model, (3, 224, 224))

作者認爲FLOPs是一種間接的測量指標,是一個近似值,並不是我們真正關心的。我們需要的是直接的指標,比如速度和延遲。
在這裏插入圖片描述在這裏插入圖片描述
圖c是經典小網絡在GPU上的MFLOPs與速度(Batches/sec)的關係。 圖d是經典小網絡在ARM上的MFLOPs與速度(Batches/sec)的關係。

我們可以發現,具有相似的FLOPs的網絡,執行的速度卻不一樣。有的相差還挺大。

作者在此提出了第一個觀點:因此,使用FLOP作爲計算複雜度的唯一指標是不充分的

理由:1) FLOPs沒有考慮幾個對速度有相當大影響的重要因素。 2)計算平臺的不同。

1) FLOPs沒有考慮幾個對速度有相當大影響的重要因素:MAC和並行度

MAC(內存訪問成本),計算機在進行計算時候要加載到緩存中,然後再計算,這個加載過程是需要時間的。其中,分組卷積(group convolution)是對MAC消耗比較多的操作。

並行度,在相同的FLOPs下,具有高並行度的模型可能比具有低並行度的另一個模型快得多。如果網絡的並行度較高,那麼速度就會有顯著的提升。

2)計算平臺的不同

不同的運行平臺,得到的FLOPs也不相同。有的平臺會對操作進行優化,比如:cudnn加強了對3×3conv計算的優化。這樣一來,不同平臺的FLOPs大小確實沒有什麼說服力。

效率對比準則
提出了2個網絡執行效率對比的設計準則:

1 使用直接度量方式如速度代替FLOPs。

2 要在目標計算平臺上計算,不然結果不具有代表性。

二、高效網絡設計實用指南(Practical Guidelines)

分析對比兩個具有代表性的最先進網絡的運行時性能(ShuffleNetV1,MobileNetV2)。

分別在GPU和CPU上去對ShuffleNetV1,MobileNetV2的運行時間進行了測試

GPU使用單個NVIDIA GeForce GTX 1080Ti。卷積庫是CUDNN 7.0。
CPU使用高通驍龍 810.
測試結果如下:
在這裏插入圖片描述
可以看到,整個運行時被分解用於不同的操作。處理器在運算的時候,不光只是進行卷積運算,也在進行其他的運算,特別是在GPU上,卷積運算只佔了運算時間的一般左右。

我們將卷積部分認爲是FLOPs操作。雖然這部分消耗的時間最多,但其他操作包括數據IO,數據混洗和逐元素操作(AddTensor,ReLU等)也佔用了相當多的時間。因此,再次確認了模型使用FLOPs指標對實際運行時間的估計不夠準確

基於這一觀察,作者從幾個不同的方面對運行時間(或速度)進行了詳細分析,併爲高效的網絡架構設計提出了幾個實用指南。

推出了四個高效網絡設計指南,這些指南不僅僅考慮了FLOP。

a、輸入輸出具有相同channel的時候,內存消耗是最小的
可以看出當c1和c2比例越接近時,速度越快,尤其是在c1:c2比例爲1:1時速度最快。這與a所提出的當c1和c2相等時MAC達到最小值相所對應。
b、過多的分組卷積操作會增大MAC,從而使模型速度變慢
之前有提到,分組卷積操作會減少參數,這樣一來網絡的計算量也就減少了。但是呢,認爲網絡的計算量減少,不代表模型的速度也會減少MAC主要的消耗來源就來自分組卷積,分組卷積一多,MAC消耗的越多,模型速度也就變慢了。
很清楚的看到,g越小,速度越快。因此,作者建議應根據目標平臺和任務仔細選擇組號。雖然組卷積能增加模型的準確度,但是作者認爲盲目使用較大的組號是不明智的,因爲這將會使得計算成本增加帶來的缺點大於準確度增加帶來的優點
c、模型中的分支數量越少,模型速度越快
作者認爲,模型中的網絡結構太複雜(分支和基本單元過多)會降低網絡的並行程度,模型速度越慢。
在這裏插入圖片描述
結果:在這裏插入圖片描述
其中, 2-fragment-series表示一個block中有2個卷積層串行,也就是簡單的疊加; 4-fragment-parallel表示一個block中有4個卷積層並行,類似Inception的整體設計。 可以看出在相同FLOPs的情況下,單卷積層(1-fragment)的速度最快

d、Element-wise操作不能被忽略
Element-wise包括Add/Relu/short-cut/depthwise convolution等操作。
元素操作類型操作雖然FLOPs非常低,但是帶來的時間消耗還是非常明顯的,尤其是在GPU上。元素操作操作雖然基本上不增加FLOPs,但是所帶來的時間消耗佔比卻不可忽視。也即Small FLOPs heavy MAC。

總結:

G1 卷積層使用相同的輸入輸出通道數

G2 注意到使用大的分組數所帶來的壞處

G3 減少分支以及所包含的基本單元

G4 減少Element-wise操作

三、ShuffleNet V2

在shufflenetV1的基礎上進行修改,得到了shuffleNetV2。首先,簡要的回顧一下V1,看看V1的網絡結構中有什麼地方違反了四條設計指南,再進行修改。
shuffleNet在resnext單元基礎上進行改進。下圖所示:
在這裏插入圖片描述
shuffleNet主要擁有兩個創新點

(1)pointwise group convolution 逐點分組卷積

(2)channel shuffle

原因:

1。逐點卷積佔了很大的計算量————> 逐點分組卷積

2。不同組之間特徵通信問題 ————> channel shuffle

逐點組卷積,就是帶分組的卷積核爲1×1的卷積,也就是說逐點組卷積是卷積核爲1×1的分組卷積。

於是shuffleNetV1從最初的a到了b。首先用帶group的1×1卷積代替原來的1×1卷積,同時跟一個channel shuffle操作。然後是3×3 dwc,然後去掉了兩個ReLU層,這個在Xception和mobileNetV2中有所介紹。

V1有何不好?

在這裏插入圖片描述
如第二節的結論所述,逐點組卷積增加了MAC違背了G2。這個成本不可忽視,特別是對於輕量級模型。另外,使用太多分組也違背了 G3。
在這裏插入圖片描述
瓶頸結構違背了G1與多單位違背了G3。
在這裏插入圖片描述
爲了實現較高的模型容量和效率,關鍵問題是如何保持大量且同樣寬的通道,既沒有密集卷積也沒有太多的分組Add操作是元素級加法操作也不可取違反了G4。因此,爲了實現較高的模型容量和效率,關鍵問題是如何保持大量且同樣寬的通道,既沒有密集卷積也沒有太多的分組
爲此,作者引入了channel split
在這裏插入圖片描述

a圖是V1,c圖是V2

1.在每個單元的開始,通過Channel split將c特徵通道的輸入被分爲兩支,分別帶有 c−c’ 和c’個通道。按照準則G3,一個分支的結構仍然保持不變。另一個分支由三個卷積組成, 爲滿足G1,令輸入和輸出通道相同。與 ShuffleNet V1 不同的是,兩個 1×1 卷積不再是組卷積(GConv),因爲Channel Split分割操作已經產生了兩個組。

2.卷積之後,把兩個分支拼接(Concat)起來,從而通道數量保持不變 (G1),而且也沒有Add操作(element-wise操作)(G4)。然後進行與ShuffleNetV1相同的Channel Shuffle操作來保證兩個分支間能進行信息交流。

3.depthwise convolution保留

上述構建模塊被重複堆疊以構建整個網絡,被稱之爲 ShuffleNet V2。基於上述分析,本文得出結論:由於對上述四個準則的遵循,shuffleNetV2架構設計非常的高效

總結:

在這裏插入圖片描述

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