1. 程式人生 > >pytorch 卷積 分組卷積 及其深度卷積

pytorch 卷積 分組卷積 及其深度卷積

先來看看pytorch二維卷積的操作API

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

現在繼續講講幾個卷積是如何操作的。

一. 普通卷積

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1

, padding=0, dilation=1, groups=1, bias=True)

普通卷積時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大小的,由於卷積權值共享,所以對於輸入的一張特徵圖

卷積時,只有3x3個引數,同一張特徵圖上進行滑窗卷積操作時引數是一樣的,剛才說的第一種卷積核和輸入的第一個特徵圖卷積完後再繼續和後面的第2,3,........64個不同的特徵圖依次卷積(一種卷積核對於輸入特徵圖來說,同一特徵圖上面卷積,引數一樣,對於不同的特徵圖上卷積不一樣),最後的引數是3x3x64。此時輸出才為一個特徵圖,因為現在才只使用了一種卷積核。一種核分別在區域性小窗口裡面和64個特徵圖卷積應該得到64個數,最後將64個數相加就可以得到一個數了,也就是輸出一個特徵圖上對應於那個視窗的值,依次滑窗就可以得到完整的特徵圖了。前面將了這麼多才使用一種卷積核,那麼現在依次類推使用32種不同的卷積核就可以得到輸出的32通道的特徵圖。最終引數為64x3x3x32.

二.分組卷積

引數group=1時,就是和普通的卷積一樣。現在假如group=4,前提是輸入特徵圖和輸出特徵圖必須是4的倍數。現在來看看是如何操作的。in_channel64分成4組,out_inchannel(也就是32種核)也分成4組,依次對應上面的普通卷方式,最終將每組輸出的8個特徵圖依次concat起來,就是結果的out_channel

三. 深度卷積depthwise

此時group=in_channle,也就是對每一個輸入的特徵圖分別用不同的卷積核卷積。out_channel必須是in_channel 的整數倍。\frac{outchannel}{inchannel}=k  .

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 .