最近开始学习使用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重载的模型不能预测和继续训练的问题。好好学习吧!