『高性能模型』輕量級網絡ShuffleNet_v1及v2

項目實現:GitHubcss

參考博客:CNN模型之ShuffleNethtml

v1論文:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devicesgit

v2論文:ShuffleNet V2: Practical Guidelines for Ecient CNN Architecture Designgithub

1、分組卷積

Group convolution是將輸入層的不一樣特徵圖進行分組,而後採用不一樣的卷積核再對各個組進行卷積,這樣會下降卷積的計算量。由於通常的卷積都是在全部的輸入特徵圖上作卷積,能夠說是全通道卷積,這是一種通道密集鏈接方式(channel dense connection),而group convolution相比則是一種通道稀疏鏈接方式(channel sparse connection)。網絡

『高性能模型』深度可分離卷積和MobileNet_v1ide

tensorflow和分組卷積的討論:Feature Request: Support for depthwise convolution by groups函數

一、分組卷積的矛盾——計算量

使用group convolution的網絡有不少,如Xception,MobileNet,ResNeXt等。其中Xception和MobileNet採用了depthwise convolution,這是一種比較特殊的group convolution,此時分組數剛好等於通道數,意味着每一個組只有一個特徵圖。是這些網絡存在一個很大的弊端是採用了密集的1x1 pointwise convolution(以下圖)。性能

這個問題能夠解決:對1x1卷積採用channel sparse connection 即分組操做,那樣計算量就能夠降下來了,但這就涉及到另一個問題。ui

二、分組卷積的矛盾——特徵通訊

group convolution層另外一個問題是不一樣組之間的特徵圖須要通訊,不然就好像分了幾個互不相干的路,你們各走各的,會下降網絡的特徵提取能力,這也能夠解釋爲何Xception,MobileNet等網絡採用密集的1x1 pointwise convolution,由於要保證group convolution以後不一樣組的特徵圖之間的信息交流。spa

三、channel shuffle

爲達到特徵通訊目的,咱們不採用dense pointwise convolution,考慮其餘的思路:channel shuffle。如圖b,其含義就是對group convolution以後的特徵圖進行「重組」,這樣能夠保證接下了採用的group convolution其輸入來自不一樣的組,所以信息能夠在不一樣組之間流轉。圖c進一步的展現了這一過程並隨機,實際上是「均勻地打亂」。

在程序上實現channel shuffle是很是容易的:假定將輸入層分爲 g 組,總通道數爲 g\times n ,首先你將通道那個維度拆分爲 (g,n) 兩個維度,而後將這兩個維度轉置變成 (n,g) ,最後從新reshape成一個維度g\times n


2、ShuffleNet

ShuffleNet的核心是採用了兩種操做:pointwise group convolution和channel shuffle,這在保持精度的同時大大下降了模型的計算量。其基本單元則是在一個殘差單元的基礎上改進而成。

一、ShuffleNet基本單元

下圖a展現了基本ResNet輕量級結構,這是一個包含3層的殘差單元:首先是1x1卷積,而後是3x3的depthwise convolution(DWConv,主要是爲了下降計算量),這裏的3x3卷積是瓶頸層(bottleneck),緊接着是1x1卷積,最後是一個短路鏈接,將輸入直接加到輸出上。

下圖b展現了改進思路:將密集的1x1卷積替換成1x1的group convolution,不過在第一個1x1卷積以後增長了一個channel shuffle操做。值得注意的是3x3卷積後面沒有增長channel shuffle,按paper的意思,對於這樣一個殘差單元,一個channel shuffle操做是足夠了。還有就是3x3的depthwise convolution以後沒有使用ReLU激活函數。

下圖c展現了其餘改進,對原輸入採用stride=2的3x3 avg pool,在depthwise convolution卷積處取stride=2保證兩個通路shape相同,而後將獲得特徵圖與輸出進行鏈接(concat,借鑑了DenseNet?),而不是相加。極致的下降計算量與參數大小。

二、ShuffleNet網絡結構

能夠看到開始使用的普通的3x3的卷積和max pool層。而後是三個階段,每一個階段都是重複堆積了幾個ShuffleNet的基本單元。對於每一個階段,第一個基本單元採用的是stride=2,這樣特徵圖width和height各下降一半,而通道數增長一倍。後面的基本單元都是stride=1,特徵圖和通道數都保持不變。對於基本單元來講,其中瓶頸層,就是3x3卷積層的通道數爲輸出通道數的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不只計算複雜度更低,並且精度更好。

3、ShuffleNet_v2

咱們首先來看v1版本和v2版本的基礎單元,(a)和(b)是ShuffleNet v1的兩種不一樣block結構,二者的差異在於後者對特徵圖尺寸作了縮小,這和ResNet中某個stage的兩種block功能相似,同理(c)和(d)是ShuffleNet v2的兩種不一樣block結構:

 

看點以下:

  從(a)和(c)的對比能夠看出首先(c)在開始處增長了一個channel split操做,這個操做將輸入特徵的通道分紅c-c’和c’,c’在文章中採用c/2,這主要是和第1點發現對應

  而後(c)中取消了1*1卷積層中的group操做,這和第2點發現對應,同時前面的channel split其實已經算是變相的group操做了

  channel shuffle的操做移到了concat後面,和第3點發現對應,同時也是由於第一個1*1卷積層沒有group操做,因此在其後面跟channel shuffle也沒有太大必要

  最後是將element-wise add操做替換成concat,這個和第4點發現對應。

多個(c)結構鏈接在一塊兒的話,channel split、concat和channel shuffle是能夠合併在一塊兒的。(b)和(d)的對比也是同理,只不過由於(d)的開始處沒有channel split操做,因此最後concat後特徵圖通道數翻倍,能夠結合後面具體網絡結構來看:


如今咱們查看一個新的概念:內存訪問消耗時間(memory access cost),它正比於模型對內存的消耗(特徵大小+卷積核大小),在這篇文章中做者使用該指標來衡量模型的速度而非傳統的FLOPs(float-point operations),它更多的側重卷積層的乘法操做,做者認爲FLOPs並不能實質的反應模型速度。

如今咱們來看一下這四點發現,分別對應告終構中的四點創新:

卷積層的輸入和輸出特徵通道數相等時MAC最小,此時模型速度最快

過多的group操做會增大MAC,從而使模型速度變慢

模型中的分支數量越少,模型速度越快

element-wise操做所帶來的時間消耗遠比在FLOPs上的體現的數值要多,所以要儘量減小element-wise操做

至於模型的具體提高,建議之間看原文的圖表。

相關文章
相關標籤/搜索