卷積神經網路學習路線(二十一) | 曠世科技 ECCV 2018 ShuffleNet V2

  • 2020 年 2 月 21 日
  • 筆記

前言

這個系列已經更新了20多篇了,感謝一直以來大家的支援和等待。前面已經介紹過MobileNet V1,MobileNet V2,MobileNet V3,ShuffleNet V1這幾個針對移動端設計的高效網路,ShuffleNetV2是ShuffleNetV1的升級版,今天就一起來看看這篇論文。論文原文見附錄。

介紹

論文首先指出目前大部分的模型加速和壓縮的論文在對比加速效果時的指標都是FLOPS,這個指標主要衡量的就是乘法和加法指令的數量。而這篇論文通過一系列實驗發現FLOPS並不能完全衡量模型的速度。如Figure1(c)和(d)所示,在FLOPS相同的情況下,速度卻有較大的區別。所以接下來就針對相同FLOPS會出現速度差異的這個問題,做了一系列工程實驗,並在ShuffleNet V1的基礎上提出方法進行改進就得到ShuffleNet V2了。

在這裡插入圖片描述

關鍵點

論文提出除了FLOPS之外,記憶體訪問消耗的時間是需要計算的,這對速度的影響也比較大。這個指標是後續一些實驗的優化目標,下面就將每個實驗獨立出來理解一下。

實驗1

探索卷積層的輸入輸出特徵通道數對MAC指標的影響。

實驗結論是卷積層的輸入和輸出特徵數相等時MAC最小,此時模型的速度最快。

在這裡插入圖片描述

這裡的結論也可以由理論推導出來,推導過程如下:

假設一個卷積層的輸入特徵圖通道數是,輸入特徵圖尺寸是和,輸出特徵通道數是,那麼這樣一個卷積層的FLOPS就是:。

接下來看看存儲空間,因為是卷積,所以輸入特徵和輸出特徵的尺寸是相同的,這裡用和表示,其中表示輸入特徵所需要的存儲空間,表示輸出特徵所需空間,表示卷積核所需存儲空間。

所以,。

根據均值不等式推出:

再把MAC和B帶入式子1就得到,因此等式成立的條件是,也就是輸入特徵通道數和輸出通道特徵數相等時,在給定FLOPs前提下,MAC達到取值的下界。

實驗2

探索卷積的group操作對MAC的影響。

實驗結論是過多的group操作會增大MAC,從而使模型變慢。

Mobilenet V1/V2/V3, ShuffleNet V1,Xception都使用了深度可分離卷積,也就是分組卷積來加速模型,這是因為分組卷積可以大大減少FLOPS。

和前面一樣,帶group操作的卷積的FLOPs如下所示:

多了一個除數,表示group數量。這是因為每個卷積核都只和個通道的輸入特徵做卷積,所以多個一個除數。

同樣MAC為:

這樣就能得到MAC和B之間的關係了,如下面的公式所示,可以看出在B不變時,g越大,MAC就越大。

下面Table2是關於卷積的group參數對模型速度的影響,其中代表的和,通過控制這個參數可以使得每個實驗的FLOPS相同,可以看出隨著的不斷增大,也不斷增大。這和前面說的在基本不影響FLOPS的前提下,引入分組卷積後可以適當增加網路寬度相吻合。

在這裡插入圖片描述

實驗3

探索模型設計的分支數量對模型速度的影響。

實驗結論是模型中的分支數量越少,模型速度越快。

論文用了fragment表示網路的支路數量。這次實驗結果如下:

在這裡插入圖片描述

其中2-fragment-series表示一個block中有2個卷積層串列,也就是簡單的堆疊。而2-fragment-parallel表示一個block中有2個卷積層並行,類似於Inception的整體設計。可以看出在相同FLOPS的情況下,單卷積層(1-fragment)的速度最快。因此模型支路越多(fragment程度越高)對於並行計算越不利,導致模型變慢,在GPU上這個影響更大,在ARM上影響相對小一點。

實驗4

探索element-wise操作對模型速度的影響。

實驗結論是element-wise操作所帶來的時間消耗遠比在FLOPS上體現的數值要多,因此要儘可能減少element-wise操作。

在文章開頭部分的Figure 2:

在這裡插入圖片描述

可以看到FLOPS主要表示的是卷積層的時間消耗,而ElementWise操作雖然基本不增加FLOPS,但是帶來的時間消耗佔比卻不可忽視。

因此論文做了實驗4,實驗4是運行了10次ResNet的bottleneck來計算的,short-cut表示的就是element-wise操作。同時作者這裡也將depthwise convolution歸為element-wise操作,因為depthwise-wise convolution也具有低FLOPS,高MAC的特點。實驗結果如Table4所示。

在這裡插入圖片描述

ShuffleNet V2 瓶頸結構設計

如Figure3所示。這張圖中的(a)(b)是ShuffleNet V1的兩種不同的block結構,兩者的差別在於(b)對特徵圖解析度做了縮小。(c)(d)是ShuffleNet V2的兩種不同結構。從(a)(c)對比可知(c)在開頭增加了一個通道分離(channel split)操作,這個操作將輸入特徵通道數分成了和,在論文中取,這主要是為了改善實驗1。然後(c)取消了卷積層中的分組操作,這主要為了改善實驗2的結論,同時前面的通道分離其實已經算是變相的分組操作了。其次,channel shuffle操作移動到了concat操作之後,這主要為了改善實驗3的結果,同時也是因為第一個卷積層沒有分組操作,所以在其後面跟channel shuffle也沒有太大必要。最後是將element-wise add操作替換成concat,這和前面的實驗4的結果對應。(b)(d)的對比也是同理,只不過因為(d)的開始處沒有通道分離操作,所以最後concat後特徵圖通道數翻倍。

在這裡插入圖片描述

ShuffleNet V2網路結構

在這裡插入圖片描述

不同stage的輸出通道倍數關係和上面介紹bottleneck結構吻合,每個stage都是由Figure3(c)(d)所示的block組成,block的具體數量對應於Repeat列。

實驗結果

從表中可以看到,ShuffleNet V2在速度和精度上對比眾多輕量級網路都是State of Art。

總結

論文的構思很像我們在工作時解決問題的方式,先是分析影響模型的速度可能有哪些因素,然後針對這些因素做出一系列實驗,最後針對這些實驗提出解決方案,最後得出了這個網路。這種思路在整個開發過程中都是通用的。

附錄

  • 論文原文:https://arxiv.org/pdf/1807.11164.pdf
  • 程式碼實現:https://github.com/anlongstory/ShuffleNet_V2-caffe
  • 參考1:https://blog.csdn.net/u014380165/article/details/81322175
  • 參考2:https://zhuanlan.zhihu.com/p/69286266

歡迎關注GiantPandaCV, 在這裡你將看到獨家的深度學習分享,堅持原創,每天分享我們學習到的新鮮知識。( • ̀ω•́ )✧