pytorch 卷積 分組卷積 及其深度卷積
先來看看pytorch二維卷積的操作API
現在繼續講講幾個卷積是如何操作的。
一. 普通卷積
torch.nn.
Conv2d
(in_channels, out_channels, kernel_size, stride=1
普通卷積時group預設為1 dilation=1(這裡先暫時不討論dilation)其餘都正常的話,比如輸入為Nx in_channel x high x width
輸出為N x out_channel x high xwidth .還是來具體的數字吧,輸入為64通道的特徵圖,輸出為32通道的特徵圖,要想得到32通道的特徵圖就必須得有32種不同的卷積核。也就是上面傳入的引數out_channel。繼續說說具體是怎麼的得到的,對於每一種卷積核會和64種不同的特徵圖依次進行卷積,比如卷積核大小是3x3大小的,由於卷積權值共享,所以對於輸入的一張特徵圖
二.分組卷積
引數group=1時,就是和普通的卷積一樣。現在假如group=4,前提是輸入特徵圖和輸出特徵圖必須是4的倍數。現在來看看是如何操作的。in_channel64分成4組,out_inchannel(也就是32種核)也分成4組,依次對應上面的普通卷方式,最終將每組輸出的8個特徵圖依次concat起來,就是結果的out_channel
三. 深度卷積depthwise
此時group=in_channle,也就是對每一個輸入的特徵圖分別用不同的卷積核卷積。out_channel必須是in_channel 的整數倍。 .
3.1 當k=1時,out_channel=in_channel ,每一個卷積核分別和每一個輸入的通道進行卷積,最後在concat起來。引數總量為3x3x64。如果此時卷積完之後接著一個64個1x1大小的卷積核。就是谷歌公司於2017年的CVPR中在論文”Xception: deep learning with depthwise separable convolutions”中提出的結構。如下圖
上圖是將1x1放在depthwise前面,其實原理都一樣。最終引數的個數是64x1x1+64x3x3。引數要小於普通的卷積方法64x3x3x64
3.2 當k是大於1的整數時,比如k=2
此時每一個輸入的特徵圖對應k個卷積核,生成k特徵圖,最終生成的特徵圖個數就是k×in_channel .