CNN卷積和通道?
1. CNN基本結構
-
全連接, 局部連接
-
權值共享
2. 卷積和通道的區別是什么
參考資料:
https://www.cnblogs.com/shine-lee/p/10243114.html
https://blog.yani.ai/filter-group-tutorial/
https://blog.csdn.net/zhangjunhit/article/details/90762578
2.1 分組卷積(Group Convolution)
Group Convolution分組卷積,最早見於AlexNet——2012年Imagenet的冠軍方法,Group Convolution被用來切分網絡,使其在2個GPU上並行運行,AlexNet網絡結構如下:
動機:用分組卷積的操作,來緩解對單個處理器的壓力。例如,當前一些輕量級的SOTA(State Of The Art)網絡。
2.2 Convolution VS Group Convolution
如果輸入feature map尺寸為C∗H∗W,卷積核有N個,輸出feature map與卷積核的數量相同也是N,每個卷積核的尺寸為C∗K∗K,N個卷積核的總參數量為N∗C∗K∗K,輸入map與輸出map的連接方式如下圖左所示:
對輸入feature map進行分組,然后每組分別卷積。假設輸入feature map的尺寸仍為C∗H∗W,輸出feature map的數量為N個,如果設定要分成G個groups,則每組的輸入feature map數量為\(\frac{C}{G}\),每組的輸出feature map數量為\(\frac{N}{G}\),每個卷積核的尺寸為\(\frac{C}{G}∗K∗K\),卷積核的總數仍為N個,每組的卷積核數量為\(\frac{N}{G}\),卷積核只與其同組的輸入map進行卷積,卷積核的總參數量為\(N*\frac{C}{G}∗K∗K\),可見,總參數量減少為原來的 \(\frac{1}{G}\),其連接方式如上圖右所示,group1輸出map數為2,有2個卷積核,每個卷積核的channel數為4,與group1的輸入map的channel數相同,卷積核只與同組的輸入map卷積,而不與其他組的輸入map卷積。
2.3 Group Convolution的用途
-
減少參數量,分成G組,則該層的參數量減少為原來的 \(\frac{1}{G}\)
-
Group Convolution可以看成是structured sparse,每個卷積核的尺寸由C∗K∗K變為\(\frac{C}{G}∗K∗K\),可以將其余\((C-\frac{C}{G})∗K∗K\)的參數視為0,有時甚至可以在減少參數量的同時獲得更好的效果(相當於正則)。
-
當分組數量等於輸入map數量,輸出map數量也等於輸入map數量,即G=N=C、N個卷積核每個尺寸為1∗K∗K時,Group Convolution就成了Depthwise Convolution,參見MobileNet和Xception等,參數量進一步縮減,如下圖所示:
-
更進一步,如果分組數G=N=C,同時卷積核的尺寸與輸入map的尺寸相同,即K=H=W,則輸出map為C∗1∗1即長度為C的向量,此時稱之為Global Depthwise Convolution(GDC),見MobileFaceNet,可以看成是全局加權池化,與 Global Average Pooling(GAP) 的不同之處在於,GDC 給每個位置賦予了可學習的權重(對於已對齊的圖像這很有效,比如人臉,中心位置和邊界位置的權重自然應該不同),而GAP每個位置的權重相同,全局取個平均,如下圖所示:
global average pooling(全局平均池化,GAP):當G=C=N且K=H=W.
在NIN(Network In Network)論文中提出的全局平均池化,主要是為了區別全連接層。CNN分類的全連接層的作用:將最后一層卷積得到的feature map stretch成向量,對這個向量做乘法,最終降低其維度,然后輸入到softmax層中得到對應的每個類別的得分。
全連接存在的問題:參數量過大,降低了訓練的速度,且很容易過擬合。全連接層將卷積層展開成向量之后不還是要針對每個feature map進行分類,而GAP的思路就是將上述兩個過程合二為一,一起做了。如圖所示:
論文:Network In Network
2.4 Depthwise Convolution && Pointwise Convolution && Depthwise Separable Convolution
-
普通卷積:假設輸入層為一個大小為64×64像素、三通道彩色圖片。經過一個包含4個Filter的卷積層,最終輸出4個Feature Map,且尺寸與輸入層相同。整個過程可以用下圖來概括。
此時,卷積層共4個Filter,每個Filter包含了3個Kernel,每個Kernel的大小為3×3。因此卷積層的參數數量可以用如下公式來計算:
N_std = 4 × 3 × 3 × 3 = 108
-
Depthwise Convolution:同樣是上述例子,一個大小為64×64像素、三通道彩色圖片首先經過第一次卷積運算,不同之處在於此次的卷積完全是在二維平面內進行,且Filter的數量與上一層的Depth相同。所以一個三通道的圖像經過運算后生成了3個Feature map,如下圖所示。
其中一個Filter只包含一個大小為3×3的Kernel,卷積部分的參數個數計算如下:
N_depthwise = 3 × 3 × 3 = 27
Depthwise Convolution完成后的Feature map數量與輸入層的depth相同,但是這種運算對輸入層的每個channel獨立進行卷積運算后就結束了,沒有有效的利用不同map在相同空間位置上的信息。因此需要增加另外一步操作來將這些map進行組合生成新的Feature map,即接下來的Pointwise Convolution。
-
Pointwise Convolution:Pointwise Convolution的運算與常規卷積運算非常相似,不同之處在於卷積核的尺寸為 1×1×M,M為上一層的depth。所以這里的卷積運算會將上一步的map在深度方向上進行加權組合,生成新的Feature map。有幾個Filter就有幾個Feature map。如下圖所示。
由於采用的是1×1卷積的方式,此步中卷積涉及到的參數個數可以計算為:
N_pointwise = 1 × 1 × 3 × 4 = 12
經過Pointwise Convolution之后,同樣輸出了4張Feature map,與常規卷積的輸出維度相同。
-
Depthwise Separable Convolution:核心思想是將一個完整的卷積運算分解為兩步進行,分別為Depthwise Convolution與Pointwise Convolution。參數個數可以計算為:
N_separable = N_depthwise + N_pointwise = 39
相同的輸入,同樣是得到4張Feature map,Separable Convolution的參數個數是常規卷積的約1/3。因此,在參數量相同的前提下,采用Separable Convolution的神經網絡層數可以做的更深。
2.5 Group Convolution 和 Depthwise + Pointwise區別
Group conv是一種channel分組的方式,Depthwise +Pointwise是卷積的方式,只是ShuffleNet里面把兩者應用起來了。因此Group conv和Depthwise +Pointwise並不能划等號。
Depthwise +Pointwise卷積是提供一種把feature map的空間信息(height&width)和通道信息(channel)拆分分別處理的方法,而group卷積只是單純的通道分組處理,降低復雜度。
3. CNN總結
-
CNN模型的發展趨勢:從巨型網絡到輕量化網絡。現在工業界追求的重點已經不是准確率的提升(因為都已經很高了),都聚焦於速度與准確率的trade off,都希望模型又快又准。因此從原來AlexNet、VGGnet,到體積小一點的Inception、Resnet系列,到目前能移植到移動端的MobileNet、ShuffleNet(體積能降低到0.5mb!)。
-
卷積核:
- 大卷積核用多個小卷積核代替;
- 單一尺寸卷積核用多尺寸卷積核代替;
- 固定形狀卷積核趨於使用可變形卷積核;
- 使用1×1卷積核(bottleneck結構)。
-
卷積層連接:
- 使用skip connection,讓模型更深;
- densely connection,使每一層都融合上其它層的特征輸出(DenseNet)
-
卷積層通道:
- 標准卷積用depthwise卷積代替;
- 使用分組卷積;
- 分組卷積前使用channel shuffle;
- 通道加權計算。
-
啟發
類比到通道加權操作,卷積層跨層連接能否也進行加權處理?bottleneck + Group conv + channel shuffle + depthwise的結合會不會成為以后降低參數量的標准配置?