對於組卷積(group convolutional)的理解(torch.nn.Conv2d中的group參數)

最近開始學習使用pytorch,在學習他人的mobilenetv1過程中發現了nn.torch.Conv2dgroup這個參數,下面是torchdepthwise

def conv_dw(inp, oup, stride):
            return nn.Sequential(
            # depthwise 
                nn.Conv2d(inp, inp, 3, stride, 1, groups=inp, bias=False),
                nn.BatchNorm2d(inp),
                nn.ReLU(inplace=True),
		   
		   # pointwise
                nn.Conv2d(inp, oup, 1, 1, 0, bias=False),
                nn.BatchNorm2d(oup),
                nn.ReLU(inplace=True),
            )

depthwise其實就是group=input_channel的時候,那麼理解好這個group也就能更好的利用卷積啦。


咱們先來看看普通的卷積神經網絡,爲了說明發表我都儘量使用圖像來表示(原諒我的畫畫水平還有M-pencil的漏墨情況嚴重@華爲官方!)

普通卷積神經網絡

[1] 對於一個filter,它其實是一個通道對應一個kernel,所有通道的kernel組成一個filter。
以上十分重要!! ,我一直以爲只有一個kernel掃過所有的input_feature得到一張feature map

[2] 理解參數數目:根據上面的想法,假設

  • 輸入爲 [N,H,W,C]
  • num_output_channelCO
  • kernel_sizek

那麼一個filter的參數數目爲k*k(使用正方形kernel,現在也有非對稱卷積1
如[1]所說,有C個kernel,所以一個filter有 kxkxc 個參數。num_output_channel=CO說明有 CO 個filter,則參數數目爲 COxkxkxc

圖來啦
在這裏插入圖片描述

組卷積神經網絡

有了基礎,理解組就十分簡單了,組卷積其實就是將input分解成group個組,然後進行卷積就好了。

=======> 一個filter只需要 C_input / group個kenel就好啦!
在這裏插入圖片描述


這有一個關於卷積其他參數的動畫介紹(padding,dialation),很有意思

最近在stackoverflow上提了一個有意思的問題,雖然被瘋狂點滅(現在好像回來了?),但是我下了挺多功夫。是關於pytorch重載的模型不能預測和繼續訓練的問題。好好學習吧!





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章