博客:blog.shinelee.me | 博客園 | CSDN
寫在前面
Group Convolution分組卷積,最早見於AlexNet——2012年Imagenet的冠軍方法,Group Convolution被用來切分網絡,使其在2個GPU上並行運行,AlexNet網絡結構如下:
Convolution VS Group Convolution
在介紹Group Convolution前,先回顧下常規卷積是怎么做的,具體可以參見博文《卷積神經網絡之卷積計算、作用與思想》。如果輸入feature map尺寸為\(C*H*W\),卷積核有\(N\)個,輸出feature map與卷積核的數量相同也是\(N\),每個卷積核的尺寸為\(C*K*K\),\(N\)個卷積核的總參數量為\(N*C*K*K\),輸入map與輸出map的連接方式如下圖左所示,圖片來自鏈接:
Group Convolution顧名思義,則是對輸入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卷積。
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每個位置的權重相同,全局取個平均,如下圖所示:
以上。