ShuffleNet系列之ShuffleNet_v2

ShuffleNet系列之ShuffleNet_v1html

MobileNet系列之MobileNet_v2算法

Inception系列之Batch-Normalization微信

導言:網絡

    目前一些網絡模型如MobileNet_v1, v2,ShuffleNet_v1, Xception採用了分組卷積,深度可分離卷積等操做,這些操做在必定程度上大大減小了FLOPs,但FLOPs並非一個直接衡量模型速度或者大小的指標,它只是經過理論上的計算量來衡量模型,然而在實際設備上,因爲各類各樣的優化計算操做,致使計算量並不能準確地衡量模型的速度,換言之,相同的FLOPs會有不一樣的推理速度。ide

    這是一篇相似於《Rethinking the Inception Architecture for Computer Vision》(即Inception_v2)的論文,在Inception_v2論文中提出了四條設計卷積網絡模型的原則,Inception_v2就是基於這些原則上設計而來。一樣,shuffleNet_v2(即《Pratical Guidelines for Efficient CNN Architecture Design》,一看這名字就知道很值得一讀)指出了四個影響模型實際推理速度的操做,並在儘可能避免這些操做的基礎上提出了ShuffleNet_v2結構。post

    ShuffleNet v2實現了在一樣的FLOPs下,速度明顯快於其餘相似網絡。例如,在500MFLOPs,ShuffleNet v2比MobileNet v2快58%,比ShuffleNet v1快63%,比Xception快25%。性能

Direct metrics

 

    前面提到FLOPs是經過理論上的計算量來衡量模型速度,這是一個indirect metrics,與direct metrics(如速度)之間是存在一些差別。主要緣由一個是FLOPs忽略了一些重要的因素,一個是MAC (memory access cost),即內存訪問的時間成本。例如分組卷積,其使得底層使用的一些優化實現算法因爲分組後實現性能更低,從而致使,分組數越大,時間成本越高。另外一個是並行度,一樣FLOPs下,高並行度的模型速度快於低並行度的模型。優化

    第二個是不一樣平臺下,一樣的FLOPs的模型運行時間不一樣。例如在最新的CUDNN library中,優化實現的3x3卷積所花費的時間並無1x1卷積的9倍。ui

    如圖所示,這是一個模型在GPU上各項操做所花費的時間,FLOPs僅表示了Conv部分的計算量,而實際上Elemwise、Data相關部分也耗費至關大的時間。所以,僅僅使用FLOPs這個indirect metrics來衡量模型速度是不夠的。設計

    ShuffleNet v2使用實際運行時間來衡量模型。

 

高效設計CNN模型的實際指南

 

    ShuffleNet v2進行了四項實驗,得出了一些比較耗時的操做,通過原理分析,提出了四條設計原則。

1. 卷積層輸入輸出通道數相同時,MAC最小

2. 分組卷積的分組數越大,MAC越大

3. 網絡支路會下降模型的並行度

4. Element-wise操做不可忽視

 

01 卷積層輸入輸出通道數相同時,MAC最小

    爲簡化計算表達式,這裏使用1x1卷積來進行理論上的推導。

    對於空間大小爲 h,w的特徵圖,輸入和輸出通道數分別爲c1和c2,使用1x1卷積, 則FLOPs爲B = h x w x c1 x c2。而MAC = hw(c1 + c2 ) + c1 x c2。這裏hwc1爲輸入特徵圖內存訪問成本,hwc2爲輸出特徵圖內存訪問時間成本,c1xc2x1x1爲卷積核內存訪問時間成本。將B表達式代入MAC表達式中,並根據不等式定理,可有以下不等式:

    由此式可知,MAC存在下限,當c1 = c2時,MAC取最小值。所以,第一組實驗即爲在相同的FLOPs下,取不一樣的輸入輸出通道數的比值c1/c2,查看不一樣c1/c2下模型運行時間。

    如圖所示,理論至關正確。在1:1時模型速度最快。

02 分組卷積的分組數越大,MAC越大

    分組卷積在一方面,使得在相同FLOPs下,分組數越大,在通道上的密集卷積就會越稀疏,模型精度也會增長,在另外一方面,更多的分組數致使MAC增長。

    使用分組卷積的FLOPs表達式爲B=h w c1 c2 /g , MAC表達式以下:

    第二組實驗是在相同的FLOPs下,查看不一樣的分組數對模型的運行速度:

  所以,分組數須要合理的選擇,須要在運行時間和精度上平衡。

 

03 網絡支路會下降模型的並行度

    在GoogLeNet(也就是Inception_v1)系列中,使用了多條支路,最後經過concat的方式拼接。這樣的支路不只提到了精度,但同時也下降了效率,這是由於支路對GPU並行運算來講是不友好的,此外,它還引入了額外的開銷,如內核啓動與同步。

    第三組實驗是在相同FLOPs狀況下,設置四個支路數不一樣的一個網絡,比較它們運行的速度。

    實驗證實,只有一條支路時,運行速度最快。所以,在網絡結構中支路數能夠提到精度,但也會下降運行速度,從而影響實時性。

04 Element-wise操做不可忽視

    正如上面給的那個圖,Element-wise操做在GPU上佔的時間是至關多的。Element-wise操做有ReLU, AddTensor, AddBias等。它們都有比較小的FLOPs,卻有比較大的MAC。特別地,depthwise conv也能夠認爲是一個Element-wise操做,由於它有較大的MAC/FLOPs比值。

    對於第四組實驗,使用ResNet中的bottleneck單元(也就是1x1卷積後接3x3卷積,再接1x1卷積,中間使用了ReLU, 另有一個shortcut鏈接),設置有無shortcut, ReLU四個不一樣的對比,得出它們的運行時間。

    實驗證實,ReLU,shortcut這些Element-wise會下降運行時間。

    對此,shuffleNet v1使用多的分組數,違背了第二條原則,使用bottleneck類似的結構違背了第一條原則,MobileNet v2使用倒殘差結構違背了第一條,且在通道數較多的feature map上使用了depthwise conv和ReLU違背了第四條,自動生成的結構有較多支路,違背了第三條。

    注意:這裏指的違背了這些原則,並非說設計很差。以第二條分組數和第三條支路數爲例,不能由於它們會下降模型運行時間,就不再使用支路和分組卷積,畢竟它們對模型精度有較大提高,所以須要選擇合適的分組數和支路數,以便在速度上和精度上取得權衡。

 

ShuffleNet v2結構

 

    shuffleNet v2是在shuffleNet v1 unit的基礎上,根據上面四組實驗得出的經驗,進行適當的權衡精度與速度而調整的。

    圖a爲shuffleNet v1正常Unit, 圖b爲shuffleNet v1降採樣Unit,圖c爲shuffleNet v2 正常Unit, 圖d爲shuffleNet v2 降採樣Unit.

    在shuffleNet v2中引入了Channel Split, 將通道數分爲c’ 和c - c’,這裏c’取c/2。一部分進行卷積操做,另外一部分直接進行concat。卷積的那一路的輸入和輸出相等,這是考慮到第一條原則。兩個1x1卷積再也不進行分組,一部分緣由是第二條原則,另外一部分是由於Channel split就至關因而分組了。兩路進行concat後,再進行Channel Shuffle,這是爲了通道上的信息進行流動。不然,左端那路的一半通道信息將一直進行到後面都沒有經過卷積層。

    對於空間降採樣層,這個Unit是沒有Channel split,這樣能夠實如今兩路concat後,通道數翻倍。其他改動具體看圖更容易理解。

 

05 網絡結構

    結構跟shuffleNet v1基本一致,惟一的差異是在全局平均池化前加入了1x1卷積,以便混合特徵。右邊的output channels下的0.5x, 1x等,只是用來表示不一樣的模型尺寸,也就是通道數不同。

 

06 網絡精度的分析

    shuffleNet v2不只效率高,並且精度也高。這有兩個主要的緣由,高效率是由於使用了更多特徵通道和更大的網絡容量來構建Block。第二點,在每一個block中,一半的通道直接進入下一個block參與下一個block,這能夠認爲是特徵再利用(feature reuse),相似於DenseNet 和CondenseNet中的想法,特徵再利用是高效高精度的設計。

Experiment

 

    實驗部分通常沒有能夠多說的地方。看圖表更能比文字表達清晰。

若有錯誤或疑問,歡迎留言指出。

本文來源於微信公衆號「 CV技術指南 」 。如有錯誤或疑問,歡迎在公衆號中留言指出。

歡迎關注公衆號「CV技術指南」,主要進行計算機視覺方向的論文解讀,最新技術跟蹤,以及CV技術的總結。正在進行的系列有網絡模型解讀、行爲識別和CV技術總結。

原創文章第一時間在公衆號中更新,博客只在有空時間才更新公衆號文章

相關文章
相關標籤/搜索