ShuffleNet深度學習網絡-結構簡介


參考博文:https://www.cnblogs.com/dengshunge/p/11407104.html

ShuffleNet是曠世提出的高效輕量化網絡,是一款很值得一提的輕量化網絡,其相關論文也是很有價值的。


ShuffleNet V1

該網絡提出於2017年,論文為《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》。

由於Xception和ResNeXt中存在大量密集的1*1卷積,導致網絡十分低效。因此,曠世提出了pointwise group convolutions來減少1*1卷積的計算復雜度。但是,這樣會帶來副作用:通道間的信息沒有得到很好的交流融合。所以,繼而提出channel shuffle來幫助信息在不同特征通道中的流動。可以看出,ShuffleNet V1的主要兩個創新點是pointwise group convolutions和channel shuffle。

 

 如Fig.1所示,左圖是普通的group卷積,卷積核只有相應的輸入通道進行作用,不同通道之間信息沒有交流。如果組數等於通道數,就可以理解成mobilenet中的depthwise convolution。(b)圖是將通道進行重新打亂排列,使得不同通道信息之間能相互交流。(c)圖是(b)圖的等價,使用了channle shuffle進行通道重新排列。如果group卷積能夠獲得不同group中的輸入數據,輸入特征和輸出特征就能很好的關聯起來。通過channle shuffle操作,能構建更加強有力的網絡結構。

為了使用好channel shuffle的操作,作者提出了ShuffleNet網絡。首先,我們先看一下其基本單元ShuffleNet Unit。如Fig.2所示,(a)圖是ResNeXT的殘差模塊,經過1*1的卷積來降低通道數,然后使用3*3的group卷積,最后使用1*1的卷積將通道數提升回原來。(b)圖是作者提出的ShuffleNet Unit,與殘差模塊類似,將殘差模塊中的1*1卷積換成1*1的group卷積,並加入了channel shuffle操作。值得注意的是,3*3的group卷積后,沒有接激活函數。(c)圖是步長為2的情況,基本類似,但最后是concat操作,而不是add,這樣做的目的是在很小的計算成本下,更容易擴大通道數。

接下來分析一下,ShuffleNet的FLOPs的變化。假設輸出尺寸為chwc∗h∗w,和bottleneck中的通道數為mm,gg是分組的組數。

  • ResNet的FLOPs為hwcm+9hwm2+hwmc=9hwm2+2hwcmhwcm+9hwm2+hwmc=9hwm2+2hwcm
  • ResNeXt的FLOPs為hwcm+9hwm2/g2+hwcm=9hwm2/g+2hwcmhwcm+9hwm2/g2+hwcm=9hwm2/g+2hwcm
  • ShuffleNet的FLOPs為9hwm+2hwcm/g9hwm+2hwcm/g(但我自己計算出來的是hwcm/g2+9hwm2/g2+hwcm/g2hwcm/g2+9hwm2/g2+hwcm/g2,不知道哪里出錯的)

可以看出,ShuffleNet相對的FLOPs較小。換而言之,在相同的計算資源限制下,ShuffleNet能使用更寬的特征圖。這個對輕量化網絡來說,是非常重要的。因為輕量化網絡通常由於特征圖寬度不足而無法更好處理信息。

基於提出的ShuffleNet Unit,可以構建出Shuffle網絡, 如Table.1所示。在整體計算資源變化不大下(~140MFLOPs),當組數g擴大的時候,可以采用更加寬的特征圖,來更好的編碼信息。

為了評估pointwise group convolution的重要性,作者在上面的網絡中使用了不同的g值(通道數會變化的情況),結果如Table.1所示。利用看出,當g>1時,性能會比g=1的情況好(g=1的網絡類似於Xception)。所以,小網絡會因為分組而得到准確率上的提升。作者認為這是因為更大的特征圖寬度對特征的編碼起到更多作用。但也值得注意的是,g值越大並不一定越好,網絡可能會飽和或者准確率出現惡化。

 最后作者在ARM平台上測試了ShuffleNet的真實速度,發現,盡管g=4或者g=8有更高的准確率,但效率卻不是最高的。最終采用g=3來折中准確率和最終運行速度。作者還嘗試了加入SE模塊,但速度大大變慢了。


 ShuffleNet V2

該網絡提出於2018年,《ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design》。主要的創新點是提出了4條輕量化的原則,並基於此4條原則,在v1基礎上提出了ShuffleNet V2。

首先介紹一下FLOPs,這里引用了知乎博主的介紹。

FLOPS: floating point  operations per second

FLOPs: floating point operations

FLOPS: 全大寫,指每秒浮點運算次數,可以理解為計算的速度。是衡量硬件性能的一個指標。(硬件)

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

 

 在衡量計算復雜度時,通常使用的是FLOPs(the number of float-point operations),但FLOPs是一個間接衡量的指標,它是一種近似但不等價於直接衡量指標。在實際中,我們所關心的是速度或者延時,而這些才是直接衡量的指標。因此,使用FLOPs作為唯一衡量計算復雜度的指標,是不充分的,而且容易導致次優的網絡設計。

直接衡量指標(速度)和間接衡量指標(FLOPs)之間的差異,主要源於以下兩個原因:

  1. 還有多個影響速度的指標,並未納入FLOPs的考慮范圍中。例如MAC(memory access cost,內存訪問成本),MAC對group卷積的速度影響很大;平行度(degree of parallelism),高平行度的網絡的推理速度更快。
  2. 不同平台對推理時間的影響。例如,CUDNN對3*3的卷積進行了優化,不能簡單認為其是1*1卷積的9倍。

所以,接下來作者對網絡的衡量指標有兩點,i)使用直接衡量指標(速度);ii)在特定的同一個平台上進行衡量。

 

 Fig.2是ShuffleNet v1和MobileNet v2的時間占比圖。從圖中可以看出,FLOPs僅僅是考慮了卷積部分,但其他時間同樣不能忽略,例如數據的讀取,Element-wise等操作。

基於上述的觀察,提出了4條關於輕量化網絡設計的原則:

  1. 當輸入通道數和輸出通道數的值接近1:1時,能減少MAC時間;
  2. 過多的group卷積,會增加MAC時間;
  3. 網絡的分裂會降低平行度;
  4. Element-wise操作是不可以忽略的,包括ReLU,AddTensor,ADDBias等。

作者批判了部分輕量化網絡,ShuffleNet v1過多依賴於group卷積,違反了原則2,而且使用了bottleneck模塊,違反了原則1;MobileNet v2使用了倒殘差模塊,違反了原則1,使用了過多的深度可分離卷積核ReLU,違反了原則4;而AutoML出來的網絡會存在分裂,違反了原則3。

所以,根據上述的4條原則,設計一種高效而且輕量化網絡的關鍵是,如何保持大通道數和通道數不變的情況下,即不使用過多卷積,又不過多分組。

 為了實現剛剛說的目的,引入了channel split操作,如Fig.3所示。(a)和(b)圖是ShuffleNet v1中的基礎單元。(c)圖是引入了channel split操作的ShuffleNet v2的基本單元。(d)圖是步長為2時的單元。

在該單元一開始,輸入被分成兩個分支,通道數分別是ccc−c‘和cc‘。左邊的分支保持不變,恆定變化;右邊的分支會經過3個卷積,使用了相同的輸入通道數和輸出通道數。其中,兩個1*1的卷積不再是group卷積,而是普通的卷積。當卷積完成后,兩個分支會進行concat,最后使用channel shuffle來進行不同通道之間的信息交流。

基於上述的基本單元,構成ShuffleNet v2的網絡結構,如Table.5所示。其中,c=c/2c‘=c/2。

 


 

綜上所述,ShuffleNet v2提出的4條原則,是十分有意義的。現在很多AutoML出來的網絡,其是以FLOPS作為限制條件的,所以最后出來的網絡FLOPS很低,但實際進行測試時,速度缺未能達到預期效果,如EfficientNet b0,實測速度約為11ms,在resnet34的速度為6ms。

另外,在接近的計算資源下,ShuffleNet v2確實能達到較高的准確率和速度,是一個很好的網絡結構。

最后,曠世在一年后,開源了ShuffleNet,有興趣的話,開源研究一下:https://github.com/megvii-model/ShuffleNet-Series


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM