分組卷積(Group Convolusion)
提到分組卷積,我們最開始應該想到是大名鼎鼎的Alexnet.Alexnet最先用到了分組卷積,由於計算資源的有限,它將網絡分成兩部分,從而能夠在兩個GPU上並行運行。如圖所示:
我們來具體看下,分組卷積是如何操作的。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VdaLYRnl-1587883560359)(http://cdn.wangng.com/deeplearning/CNN中的Group&&Depthwise&&pointerwise卷積/分組卷積.png)]
如上圖所示,左邊的是常規的卷積,右邊就是分組卷積。它把輸入的特徵圖分成了幾個組,然後各個組分別進行常規的卷積,將分組卷積後得到的特徵圖進行concat拼接,最後得到新的特徵圖。
常規卷積vs分組卷積
從圖中(線代表卷積操作)可以明顯看出,分組卷積的計算量是明顯低於常規卷積。這只是從圖中判斷而已,我們來具體分析下這個計算量到底少多少?
就以上面的圖爲例,假設輸入特徵圖的大小是H*W*N
,卷積核的數量大小是M*k*k*N
,那麼輸出的特徵圖很快就能算出來就是H*W*M
,另外假設分組大小是g組。我們來計算下兩種卷積的參數量情況。
常規卷積的參數量是M*k*k*N
。分組卷積我們仔細分析下,我們先計算一組的參數量,輸入現在是H * W * N/g
,輸出是H * W * M/s
,那麼相應的卷積核數量大小就是M/s * k * k * N/s
。所以分組卷積中一組的參數量就是M/s * k * k * N/s
,一共有s組,最終的參數量爲M * k * k * N/s
,相比常規的卷積,分組卷積的參數量是它的1/s
倍。這也是爲什麼人們會用分組卷積來代替常規卷積來降低模型的參數量。
Depthwise卷積
Depthwise卷積其實可以看做是分組卷積的極端情況。還是以上圖爲例,輸入特徵圖爲H*W*N
,如果我們把分組大小s設成是輸入特徵圖的深度(depth)N,輸出特徵圖的大小也爲H*W*N
。那麼這樣的卷積方式就成爲Depthwise卷積。
從圖中我們可以看出,經過Depthwise卷積後,輸出特徵圖的深度和輸入特徵圖的深度保持一致。這種針對每個channel的卷積方式,沒有有效的利用不同map對相同位置空間的信息,使得卷積後的效果大打折扣,雖然參數量進一步減少了。
Depthwise卷積的參數量爲k*k*N
。是常規卷積的1/N
Pointerwise卷積
Pointerwise卷積一般是緊跟Depthwise卷積的。Pointerwise卷積和常規卷積很相似,只不過卷積核的大小變成了1*1*M
,M是上一層卷積的channl數。pointerwise卷積會對上一層的特徵圖在各個channel上進行線性加權就和,得到一個新的channel爲1的特徵圖。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-clquCXgM-1587883560371)(http://cdn.wangng.com/deeplearning/CNN中的Group&&Depthwise&&pointerwise卷積/pointwise.png)]
這裏的pointerwise卷積就是我們所謂的1*1
卷積。它會對上一層的特徵圖在channl維進行拓展。Pointerwise卷積的參數量是N*1*1*M
,是常規卷積的1/(k^2)
深度可分離卷積
說完Depthwise和pointwise卷積後,深度可分離卷積就很好理解了,深度可分離卷積就是這兩種卷積的組合,它將常規卷積分成了兩部分,輸入特徵圖先經過Depthwise卷積,再經過pointerwise卷積。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9tGHw7dE-1587883560375)(http://cdn.wangng.com/deeplearning/CNN中的Group&&Depthwise&&pointerwise卷積/seperate.png)]
參數量方面我們來計算下:
這和我們分別計算的結果是吻合的。
參考
1.A Tutorial on Filter Groups (Grouped Convolution)
2.https://www.cnblogs.com/shine-lee/p/10243114.html
3.理解分組卷積和深度可分離卷積如何降低參數量