【閱讀】ShuffleNet和MobileNetv1, v2

最近在考慮通道融合的事情,記得之前看了微軟亞洲研究院出的一篇文章有相關信息,但是突然找不到了。暫時先研究一下shuffle net把。

【簡介】ShuffleNet是Face++孫健博士團隊的成果,目標是減少網絡參數的同時也能夠獲得較好的精度。和MobileNet是一路網絡。論文:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices,實現:Github

ShuffleNet

1、核心思想

文章的思想很簡單,在group之後增加通道信息的融合。
這裏寫圖片描述
圖a是使用group的網絡結構,假設groups=3,通道會被等分分開卷積,但是次序並不會被打亂,從而導致groups之間的特徵無法進行融合。對於groups=3的卷積層,假設inputs爲CxHxW, outputs爲OxHxW,那麼inputs會被拆分爲C/3xHxW,outputs也會被拆分成O/3xHxW,然後分開卷積之後Concate。ResNext使用的就是這種操作,其實這種結構在Alexnet中已經出現,可以通過caffe的prototxt比較下。

圖b就是文章的proposal,在不同的group中進行shuffe操作方式很簡單,類似於MapReduce框架數據的shuffle。

圖c就是shuffle之後的數據分佈圖。

2、網絡結構

這裏寫圖片描述

圖a是類似resnet v1的網絡module,採用bottleneck的方式,先用1x1 conv降低通道數,之後3x3 conv,再之後是1x1 conv增加通道數。這種結構也能夠增加通道之間的數據的融合。不過這裏3x3 conv 使用的是類似MobileNet的depthwise conv,Details看下面的MobileNet部分。

圖b中,把兩個1x1conv中替換成了group conv, 並且插入了Channel Shuffle Layer,另外一個調整就是少了一個Relu(這個不知道爲啥?MobileNet裏面的結構?)。

圖c類resnet v1中down sample結構。和resnet不同的是,resnet是使用3x3 stride2 conv 而這裏是 3x3 AVG Pooling。

網絡結構

這裏寫圖片描述

前面的conv 和 pooling遵行了resnet的設計思想,stride等於2,迅速降低feature map的大小。但是網絡中stage對比resnet少了一個。

實驗對比

這裏寫圖片描述

爲了方便描述,這裏引入一個參數s用來改變從通道數,模型的通道數表示s乘以上表中原始結構的通道數。從圖中可以看出。通道越多,g越大結果越好

這裏寫圖片描述

這裏是和MobileNet的比較,自然效果也挺好的,而且作者比較的時候使用了SENet的網絡結構。下過又好了一些。可以SENet的網絡結構確實有幫助。

ShuffleNet相對於Xception和MobileNet,在精度上有了提升,但是在速度上提升則不太明顯。因爲shuffle步驟的計算量。

這裏提到SENet簡單的總結一下我看過的網絡結構的思想。feature map可以表示成CxHxW,早期的網絡結構的設計的目的大多爲了增加感受視野。例如Deeplab引入dialation參數和對不同的dialation的結果進行Pyramid,Inception不同的卷積結構(多個小卷積代替大的卷積核),還有PSPNet網絡結構中的Pooling Pyramid,都是爲了增加感受視野,加入全局信息。另外Attention機制,應該也是對feature map進行spatial的weight。可見上述方法主要集中的維度在於HxW。而最近的網絡結構大多在Channel這個維度做文章,例如ResNext對Channel 進行 groups,SENet則對Channel進行weighted,ShuffleNet對Channel進行shuffle,感覺可以對Channel做的事情還可以更多(不知道可以做個Pyramids不,微笑臉)。當然還有3D cnn,也是對feature map增加爲維度,還有bottleneck結構。上述方法都可以歸結爲增加feature map中的信息和進行信息的融了。像找創新點的同學可以從這裏出發。

MobileNet V1

MobileNet是google的成果。目的是降低參數同時保持精度。 《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》

【核心簡介】MobileNet的核心思想很簡答。1、Depthwise Separable Conv 分步卷積;2、引入表示Width 乘子,控制通道數;3、引入feature map乘子,控制分辨率 resolution。後面兩個感覺只是爲了控制模型的表示而引入的超參,就像ResNext的cardinality和densenet的bn_size和growth_rate,只不過這裏是專門用來表示模型複雜度而已。

Depthwise Separable Conv

這裏寫圖片描述

這個就是MobileNet的核心,也是減少參數量的關鍵所在。據說這種思想也不是MobileNet第一次提出,這個就不多說了。下面介紹原理:

卷積的實現方式主要分爲兩種
1、sliding window:caffe等大多框架使用的方法
2、傅立葉變換:ifft2(fft2(img)*fft2(filter))

caffe中卷積的實現,假設inputs feature map:MxHxW,outpu feature map: NxHxW。卷積和可以表示爲NxMxKxK(對應上圖左邊)。使用im2col,MxHxW=>A (HxW)x(MxKxK), kernel NxMxKxK=>B Nx(MxKxK)。transpose(B)*A可以得到卷積後的結果。(猛戳知乎大神解答)

Depthwise Separable Conv 分爲兩部進行,先使用M個KxK filters,對輸入進行逐個通道的卷積。然後再使用N個Mx1x1 filters對第一步結果再次進行卷積。這樣,原來filters從原來的NxMxKxK變成了(Mx1xKxK+NxMx1x1),從而達到減少參數量的目的。

MobileNet V2

主要兩個改進點:
1、inverted residual:resnet v1的bottleneck是降維、卷積、升維,而M V2變成了升維、卷積、降維
2、linear bottleneck: 去掉最後的線性結構,跟resnetv2類似
http://blog.csdn.net/u014380165/article/details/75142710

更多閱讀:

http://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/78526448
http://blog.csdn.net/zchang81/article/details/73321202
http://blog.csdn.net/whz1861/article/details/78447167
http://blog.csdn.net/jianyuchen23/article/details/76996903

Reference

[1] http://blog.csdn.net/shuzfan/article/details/77141425
[2] http://blog.csdn.net/shuzfan/article/details/70940308

發佈了25 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章