深度分離卷積是Xception這個模型中提出來的(不太確定,但肯定是它讓這個概念為大眾周知),具體來說分為兩步,depthwise conv和pointwise conv,前者對輸入特征圖的每個通道進行卷積,然后將輸出串聯,后者就是大家都知道的1X1卷積,二者結合,使得參數量和計算量大幅減少,關鍵是效果還挺好,不服不行。因為自己想在網絡中加入這一結構,於是谷歌pytorch是怎么實現的,發現結果不多,不過還是看到了想要的答案,在這個項目里https://github.com/tstandley/Xception-PyTorch/blob/master/xception.py,這是一個xception的pytorch實現,里面有關於depthwise卷積的實現,然后我發現pytorch已經支持了,至少在0.4中可以。
我就記錄下這個函數吧。准確地說是類。
class torch.nn.
Conv2d
(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1,bias=True)
其中,輸入輸出,核的size,步長,補零都不用說了,dilation是關於卷積核的,不講了,groups就是實現depthwise conv的關鍵,默認為1,意思是將輸入分為一組,此時是常規卷積,當將其設為in_channels時,意思是將輸入的每一個通道作為一組,然后分別對其卷積,輸出通道數為k,最后再將每組的輸出串聯,最后通道數為in_channels*K。
最后總結下,要實現depthwise conv,就將groups設為in_channels,同時out_channels也設為與in_channels相同。
然后再加上1X1卷積,這樣就符合xception的結構了。