最近開始學習使用pytorch
,在學習他人的mobilenetv1過程中發現了nn.torch.Conv2d
中group這個參數,下面是torch
中depthwise
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_channel
爲 COkernel_size
爲 k
那麼一個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重載的模型不能預測和繼續訓練的問題。好好學習吧!