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