如何看待Face++出品的小型化網路ShuffleNet?

https://arxiv.org/abs/1707.01083


放arxiv那天看了一下,整篇paper思路讀下來還是非常清晰的,實驗效果也很不錯。

整體的網路結構設計延續了ResNe(X)t的設計思路,主要不同的地方在於

(1)把bottleneck中的1x1 conv也換成了group conv (因為實際1x1 conv也佔據了很大一部分計算量),原本的3x3 group conv用最極端的depthwise conv代替。然後為了解決stacked group conv造成的上一層group conv中特定的一些feature只作用於下一層一部分group conv帶來的weakens representation問題(這裡我覺得可以理解成在stacked group conv里不同group的feature是沒有被aggregate的),把上一層不同group conv得到的feature做了一個channel shuffle,來保證group feature在不同group之間的流動。

(2)downsample的block用3x3 stride2的avg pool代替了之前的1x1 stride2的conv,然後用concat代替sum,使得原本應該加倍的filter數保持不變。這應該算是兩個減少計算量的技巧吧,可能對實際的效果不會有太大的影響。

其他的像depthwise conv後面沒加ReLU什麼的就不提了。

實驗結果是優於mobilenet的,特別是在小模型上(40MFLOPS級別的arch2比mobilenet高了接近7個點),其他的ablation study還有detection的實驗paper里都寫的十分詳細了。

實現上也比較方便,channel shuffle用現有的reshape, transpose做個組合就行了,流程應該是:

先把(b,g*n,h,w)reshape成(b,g,n,h,w),然後transpose為(b,n,g,h,w)之後再reshape成(b,n*g,h,w)

所以演算法上復現起來應該也不是很難,比較難的是有一個高效的depthwise conv以及pointwise group conv的實現。


用過的都說好。 @周昕宇

===================

ShuffleNet 0.25x 的運算量是 13M

在224x224x3的圖上,

算一下gradient強度需要0.6M

做一次3x3的高斯模糊需要0.9M

卷一個5x5的kernel需要3.8M

卷一個7x7的kernel需要7.4M

運行AlexNet第一層需要105.4M

跑一個1000分類的linear svm需要150M

而這個神奇的小網路不光輸出了1000分類的label,還能產生 384通道的feature map

煉丹還是件很神奇的事


Lenet-5 的 s2層(6個 feature map)到 c3 層(16個feature map)的對應關係如下。

我很疑惑這不就是一種 「group」的思想嗎?目前大多數的卷積核都會對上一層的所有 feature map進行卷積,是不是他們沒發現像 shuffleNet 這樣各負責一部分 feature map 也是可以的?


原理方面@Maxsky說的比較清楚了,感覺這篇文章idea很棒。

昨天用mxnet實現了一版,https://github.com/ZiyueHuang/MXShuffleNet


非常感謝作者耐心指導。(自己實現的時候沒看清楚論文踩了很多坑,作者親自看了prototxt然後給我指出來了,超級贊!)

根據已經實現的g=3(x1,x0.5)和g=8(x0.25)的訓練結果,論文上的精度能夠得到,訓出來的(x0.5,g=3)在驗證集上比作者的準確率還要高1%左右。

實際上,這個網路最驚艷的並不是它的精度啥的,而是在限制模型規模和計算量的情況下(注意這個前提),尤其是對計算力有限的移動設備,同等速度下其他網路難以達到這個Accuracy,而且它能夠拿到足夠多的feature,非常適合做比如detection等應用。

作者在文章最後提到在arm平台上15.2ms(x0.5)的速度,雖然作者回復說用到機密的高速卷積庫,但是採用開源庫經過優化後,我的手機上也能達到其兩倍左右的時間,已經相當不錯了。

不知道各位,有關這個網路思路接下去有什麼能夠加速的方法,或者對網路結構的改良呢?歡迎交流!


沒人邀請我也要強答

論文已經實現了,在訓練,挖個坑,到時候來回答結果


這個文章的貢獻是對卷積神經網路模型里的計算進行了簡化,同時保持了精度。

簡化的方式分而治之相對運動

分而治之是把原來對全部特徵同時進行處理改為分為若干組,比如3組,分別進行處理。這就省了每次對空間特徵卷積完還要進行組合的計算量。

但是這樣就帶來了各組特徵間的組合特徵缺失的問題。於是文章提出,把每組的特徵們重新混合一下再繼續按組進行處理。這也就是頭靜扇子動和扇子靜頭動的區別,選擇頭動更好。這就是借鑒了牛頓第三定律和愛因斯坦的相對論得到的相對運動取其輕法則。好了,就編到這裡吧。


不知最後40Mflops / 15.2ms的性能測試是在怎樣的ARM硬體上用怎樣的運算實現得到的。算下來平均性能達到了2.6GFlops,針對這樣一個包含大量分group的小卷積的模型而言相當不錯。


ShuffleNet 訓練目前使用線性學習率,lr初始值取0.1,wd取0.00004正在訓練,當loss下不去的時候,將lr*0.1,接著訓練;目前達到的top1/top5: 63.78%/85.10%

**************************************************************

剛看了,來講下個人感受。除了借用了ResNeXt 中的設計,另外也將1x1的conv也進一步修改成1x1 group conv+channel_shuffle(減小計算量+不同group之間的信息不獨立)。取最好的設計結構來看,Cls err 也只是比mobilenet低了0.3%,按照paper,有50 layers(mobilenet 28 layers);如果追求精度的情況下感覺沒有比mobilenet有太大的優勢


強答一發。

我們組關注mobile net很久了,也針對性地在自己的數據集上做了很多實驗,目前來說性能是非常滿意的,大量並發且無需累加的二維卷積很適合硬體實現。

shuffle net主要的創新點之一channel shuffle非常類似於對3*3模板做裁剪。詳細回去再發


自薦一下我改寫的caffe實現代碼,訓練速度更快,並提供了一個deploy供大家參考

https://github.com/farmingyard/ShuffleNet


問問題要放文獻傳送門的呀。。。


正在實現,不知實際跑起來速度如何。


正在學習,其實綜合了resnet,mobilenet等網路模型的亮點,繼續關注。


推薦閱讀:

CNN做圖像分類,訓練集中的極少量樣本被貼上了錯誤的標籤,是否會嚴重污染訓練集?對訓練結果影響大嗎?
Tensorflow 的reduce_sum()函數到底是什麼意思,誰能解釋下?
如何看待谷歌移動端深度學習框架 TensorFlow Lite 正式發布?可能會帶來什麼影響?
有沒有基於移動端GPU的深度學習前饋網路框架?
如何評價deep mind開源的sonnet?

TAG:移動應用 | 計算機視覺 | 深度學習DeepLearning | TensorFlow |