shuffleNet_shuffer
目錄
分組卷積
分組卷積的矛盾——計算量
分組卷積的矛盾——特征通信
channel shuffle
ShuffleNet V1
ShuffleNet基本單元
ShuffleNet網絡結構
對比實驗
ShuffleNet V2
設計理念
網絡結構
對比實驗
分組卷積
Group convolution是將輸入層的不同特征圖進行分組,然后采用不同的卷積核再對各個組進行卷積,這樣會降低卷積的計算量。因為一般的卷積都是在所有的輸入特征圖上做卷積,可以說是全通道卷積,這是一種通道密集連接方式(channel dense connection),而group convolution相比則是一種通道稀疏連接方式(channel sparse connection)。
分組卷積的矛盾——計算量
使用group convolution的網絡有很多,如Xception,MobileNet,ResNeXt等。其中Xception和MobileNet采用了depthwise convolution,這是一種比較特殊的group convolution,此時分組數恰好等于通道數,意味著每個組只有一個特征圖。但這些網絡存在一個很大的弊端:采用了密集的1×1 pointwise convolution。
這個問題可以解決:對1×1卷積采用channel sparse connection, 即分組卷積,那樣計算量就可以降下來了,但這就涉及到下面一個問題。
分組卷積的矛盾——特征通信
group convolution層另一個問題是不同組之間的特征圖需要通信,否則就好像分了幾個互不相干的路,大家各走各的,會降低網絡的特征提取能力,這也可以解釋為什么Xception,MobileNet等網絡采用密集的1×1 pointwise convolution,因為要保證group convolution之后不同組的特征圖之間的信息交流。
channel shuffle
為達到特征通信目的,我們不采用dense pointwise convolution,考慮其他的思路:channel shuffle。其含義就是對group convolution之后的特征圖進行“重組”,這樣可以保證接下了采用的group convolution其輸入來自不同的組,因此信息可以在不同組之間流轉。圖c進一步的展示了這一過程并隨機,其實是“均勻地打亂”。
ShuffleNet V1
ShuffleNet基本單元
下圖a展示了基本ResNet輕量級結構,這是一個包含3層的殘差單元:首先是1×1卷積,然后是3×3的depthwise convolution(DWConv,主要是為了降低計算量),緊接著是1×1卷積,最后是一個短路連接,將輸入直接加到輸出上。
下圖b展示了改進思路:將密集的1×1卷積替換成1×1的group convolution,不過在第一個1×1卷積之后增加了一個channel shuffle操作。值得注意的是3×3卷積后面沒有增加channel shuffle,按paper的意思,對于這樣一個殘差單元,一個channel shuffle操作是足夠了。還有就是3×3的depthwise convolution之后沒有使用ReLU激活函數。
下圖c的降采樣版本,對原輸入采用stride=2的3×3 avg pool,在depthwise convolution卷積處取stride=2保證兩個通路shape相同,然后將得到特征圖與輸出進行連接而不是相加。極致的降低計算量與參數大小。
ShuffleNet網絡結構
可以看到開始使用的普通的3×3的卷積和max pool層。然后是三個階段,每個階段都是重復堆積了幾個ShuffleNet的基本單元。對于每個階段,第一個基本單元采用的是stride=2,這樣特征圖width和height各降低一半,而通道數增加一倍。后面的基本單元都是stride=1,特征圖和通道數都保持不變。對于基本單元來說,其中瓶頸層,就是3×3卷積層的通道數為輸出通道數的1/4,這和殘差單元的設計理念是一樣的。
對比實驗
下表給出了不同g值(分組數)的ShuffleNet在ImageNet上的實驗結果。可以看到基本上當g越大時,效果越好,這是因為采用更多的分組后,在相同的計算約束下可以使用更多的通道數,或者說特征圖數量增加,網絡的特征提取能力增強,網絡性能得到提升。注意Shuffle 1x是基準模型,而0.5x和0.25x表示的是在基準模型上將通道數縮小為原來的0.5和0.25。
除此之外,作者還對比了不采用channle shuffle和采用之后的網絡性能對比,如下表的看到,采用channle shuffle之后,網絡性能更好,從而證明channle shuffle的有效性。
然后是ShuffleNet與MobileNet的對比,如下表ShuffleNet不僅計算復雜度更低,而且精度更好。
ShuffleNet V2
設計理念
目前衡量模型復雜度的一個通用指標是FLOPs,具體指的是multiply-add數量,但是這卻是一個間接指標,因為它不完全等同于速度。相同FLOPs的兩個模型,其速度可能存在差異。這種不一致主要歸結為兩個原因,首先影響速度的不僅僅是FLOPs,如內存使用量(memory access cost, MAC),這不能忽略,對于GPUs來說可能會是瓶頸。另外模型的并行程度也影響速度,并行度高的模型速度相對更快。另外一個原因,模型在不同平臺上的運行速度是有差異的,如GPU和ARM,而且采用不同的庫也會有影響。
據此,作者在特定的平臺下研究ShuffleNetv1和MobileNetv2的運行時間,并結合理論與實驗得到了4條實用的指導原則:
- 同等輸入個輸出通道數能最小化內存訪問量
- (G2)過量使用組卷積會增加MAC
- (G3)網絡碎片化會降低并行度一些網絡如Inception,以及Auto ML自動產生的網絡NASNET-A,它們傾向于采用“多路”結構,即存在一個lock中很多不同的小卷積或者pooling,這很容易造成網絡碎片化,減低模型的并行度,相應速度會慢,這也可以通過實驗得到證明。
- (G4)不能忽略元素級操作對于元素級(element-wise operators)比如ReLU和Add,雖然它們的FLOPs較小,但是卻需要較大的MAC。這里實驗發現如果將ResNet中殘差單元中的ReLU和shortcut移除的話,速度有20%的提升。
上面4條指導準則總結如下:
- 1×1卷積進行平衡輸入和輸出的通道大小;
- 組卷積要謹慎使用,注意分組數;
- 避免網絡的碎片化;
- 減少元素級運算。
網絡結構
根據前面的4條準則,作者分析了ShuffleNetv1設計的不足,并在此基礎上改進得到了ShuffleNetv2,兩者模塊上的對比如下圖所示:
在ShuffleNetv1的模塊中,大量使用了1×1組卷積,這違背了G2原則,另外v1采用了類似ResNet中的瓶頸層(bottleneck layer),輸入和輸出通道數不同,這違背了G1原則。同時使用過多的組,也違背了G3原則。短路連接中存在大量的元素級Add運算,這違背了G4原則。
為了改善v1的缺陷,v2版本引入了一種新的運算:channel split。具體來說,在開始時先將輸入特征圖在通道維度分成兩個分支:通道數分別為 c-c’和 c’.實際實現時。左邊分支做同等映射(即不改變,直接和后面層concat);右邊的分支包含3個連續的卷積,并且輸入和輸出通道相同,這符合G1。而且兩個1×1卷積不再是組卷積,這符合G2,另外兩個分支相當于已經分成兩組。兩個分支的輸出不再是Add元素,而是concat在一起,緊接著是對兩個分支concat結果進行channle shuffle,以保證兩個分支信息交流。其實concat和channel shuffle可以和下一個模塊單元的channel split合成一個元素級運算,這符合原則G4。
對于下采樣模塊,不再有channel split,而是每個分支都是直接copy一份輸入,每個分支都有stride=2的下采樣,最后concat在一起后,特征圖空間大小減半,但是通道數翻倍。
ShuffleNetv2的整體結構如表2所示,基本與v1類似,其中設定每個block的channel數,如0.5x,1x,可以調整模型的復雜度。
值得注意的一點是,v2在全局pooling之前增加了個conv5卷積,這是與v1的一個區別。
對比實驗
最終的模型在ImageNet上的分類效果如表3所示:
可以看到,在同等條件下,ShuffleNetv2相比其他模型速度稍快,而且準確度也稍好一點。同時作者還設計了大的ShuffleNetv2網絡,相比ResNet結構,其效果照樣具有競爭力。
從一定程度上說,ShuffleNetv2借鑒了DenseNet網絡,把shortcut結構從Add換成了Concat,這實現了特征重用。但是不同于DenseNet,v2并不是密集地concat,而且concat之后有channel shuffle以混合特征,這或許是v2即快又好的一個重要原因。
參考:
『高性能模型』輕量級網絡ShuffleNet_v1及v2
ShuffleNetV2:輕量級CNN網絡中的桂冠
總結
以上是生活随笔為你收集整理的shuffleNet_shuffer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这些因素你都满足,那你家的WIFI体验效
- 下一篇: javascript 换行符[通俗易懂]