天天看點

QDD基礎網絡系列(1)——ShuffleNet

論文位址https://arxiv.org/pdf/1707.01083.pdf

前言:

最近感覺自己寫的部落格,比較膚淺浮于表面,是以決定要寫一個系列,沒有想太多,但是希望能夠用兩三個月的時間,把這個系列介紹好,算給自己打基礎了就。

正文

相信咱們這個領域的應該都知道前幾天Geoffrey Hinton, Yann LeCun,和Yoshua Bengio共同獲得了2019年的圖靈獎,心疼Ng三秒,畢竟忙着和媳婦兒開公司呢。言歸正傳被近些年來随着神經網絡的崛起,網絡的層數是越來越深,結構是越來越複雜,需要的計算資源也是開始動辄出現幾百塊的需求了。那在這種情況下,工業界就說,如果我需要在我的手機上,cpu端或者ARM架構下使用,怎麼辦。這就有很多的解決辦法,比如剪支,比如模型壓縮,或者直接設計小體量的模型。

于是這篇ShuffleNet是曠世的孫老師他們提出的一種計算高效的CNN模型,以及近期提出的Mobilenet和SqueezeNet等模型就提供了一種可行的解決方案。這幾個網絡可以應用于移動端,但是shufflenet在性能以及速度方面比較其他的網絡都有較大的提升。

那麼到底是如何實作ShuffleNet的呢?作者一共提出了這兩個問題,解決了這兩個問題就能弄明白這個網絡了:

一 pointwise group convolution

1)我相信大部分同學看到這個詞和我本人一樣是蒙蔽的,這裡面有很大的講究,讓我來慢慢講給你聽。

首先這個pointwise convolution,又稱為逐點卷積,深度可分離卷積。

QDD基礎網絡系列(1)——ShuffleNet

這是常見的卷積形式:舉個例子,假設有一個3×3大小的卷積層,要求輸入為16通道、輸出為32通道。那麼顯而易見我們就需要32個3*3的卷積核,每個卷積核攜帶的參數量是3*3*16,那麼這個卷積過程所需要的參數量即使(3×3×16)×32 =4068

QDD基礎網絡系列(1)——ShuffleNet

而深度可分離卷積(逐點卷積)可以分為如上圖所示的兩個過程:①用16個3×3大小的卷積核(1通道)分别與輸入的16通道的資料做卷積(這裡使用了16個1通道的卷積核,輸入資料的每個通道用1個3×3的卷積核卷積),得到了16個通道的特征圖,我們說該步操作是depthwise(逐層)的,在疊加16個特征圖之前,②接着用32個1×1大小的卷積核(16通道)在這16個特征圖進行卷積運算,将16個通道的資訊進行融合(用1×1的卷積進行不同通道間的資訊融合),我們說該步操作是pointwise(逐像素)的。這樣我們可以算出整個過程使用了3×3×16+(1×1×16)×32 =656個參數。

2)group convolution

下面開始介紹group convolution:分組卷積,最早在AlexNet中出現,由于當時的硬體資源有限,訓練AlexNet時卷積操作不能全部放在同一個GPU處理,是以作者把feature maps分給多個GPU分别進行處理,最後把多個GPU的結果進行融合。

QDD基礎網絡系列(1)——ShuffleNet

這是一般我們看到的卷積的過程,一般的卷積過程是對于整個圖像進行的,輸入H1×W1×C1;而卷積核大小為h1×w1,一共有C2個,然後卷積得到的輸出資料就是H2×W2×C2。這裡我們假設輸出和輸出的分辨率是不變的。我們可以看到這是把整個圖檔一次性讀入,對于系統的存儲會有一些要求。

QDD基礎網絡系列(1)——ShuffleNet

上圖所示就是分組卷積的示意圖:圖中将輸入資料分成了2組(組數為g),需要注意的是,這種分組隻是在深度上進行劃分,即某幾個通道編為一組,這個具體的數量由(C1/g)決定。因為輸出資料的改變,相應的,卷積核也需要做出同樣的改變。即每組中卷積核的深度也就變成了(C1/g),而卷積核的大小是不需要改變的,此時每組的卷積核的個數就變成了(C2/g)個,而不是原來的C2了。

從一個具體的例子來看,Group conv本身就極大地減少了參數。比如當輸入通道為256,輸出通道也為256,kernel size為3×3,不做Group conv參數為256×3×3×256。實施分組卷積時,若group為8,每個group的input channel和output channel均為32,參數為8×32×3×3×32,是原來的八分之一。而Group conv最後每一組輸出的feature maps應該是以concatenate的方式組合。

Alex認為group conv的方式能夠增加 filter之間的對角相關性,而且能夠減少訓練參數,不容易過拟合,這類似于正則的效果。

二 channel shuffle

分組卷積存在另外一個弊端,如圖1-a所示,其中GConv是group convolution,這裡分組數是3。可以看到當堆積GConv層後一個問題是不同組之間的特征圖是不通信的,這就好像分了三個互不相幹的路,大家各走各的,這目測會降低網絡的特征提取能力

QDD基礎網絡系列(1)——ShuffleNet

為了實作通道間的資訊交流,規避上述弊端:如圖1-b所示,你可以對group convolution之後的特征圖進行“重組”,這樣可以保證接下了采用的group convolution其輸入來自不同的組,是以資訊可以在不同組之間流轉。這個操作等價于圖2-c,即group convolution之後對channels進行shuffle,但并不是随機的,其實是“均勻地打亂”。在程式上實作channel shuffle是非常容易的:假定将輸入層分為 

QDD基礎網絡系列(1)——ShuffleNet

 組,總通道數為 

QDD基礎網絡系列(1)——ShuffleNet

 ,首先你将通道那個次元拆分為 

QDD基礎網絡系列(1)——ShuffleNet

 兩個次元,然後将這兩個次元轉置變成 

QDD基礎網絡系列(1)——ShuffleNet

 ,最後重新reshape成一個次元。channel shuffle操作還有一個好處是能保證端到端的訓練。

這是我看到網上畫的一張比較有意思的圖(我借用一下,如有侵權,聯系删,末尾引用)

QDD基礎網絡系列(1)——ShuffleNet

好啦,重點内容就将這麼多啦

我知道你們在等代碼:https://github.com/MG2033/ShuffleNet

裡面還有幾個bug,調不出來的私聊我啦。

拜拜

參考:

1卷積原理:幾種常用的卷積(标準卷積、深度卷積、組卷積、擴充卷積、反卷積)

2 CNN模型之ShuffleNet

3 輕量級網絡--ShuffleNet論文解讀

學術交流可以關注我的公衆号,背景留言,粉絲不多,看到必回。卑微小錢線上祈求

QDD基礎網絡系列(1)——ShuffleNet

繼續閱讀