类似的内容非常多,只是想写一写当作复习,如果错误请指出,感谢大家的指点。

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)

卷积层参数个数

假设in_channels = 5, out_channels = 6, 卷积核大小 3*3,其他参数默认

那么参数总数量为 (3*3*5+1)*6.

因为输入有5个通道,所以卷积核也会对应有5个通道再加上每个卷积核共享一个权重,这里提供了式子中 3*3*5+1的部分。

输出有6个通道,所以一共需要6个卷积核,最终参数数量就是(3*3*5+1)*6。

feature map大小

feature map的大小 取决于以下几点

输入图像尺寸大小

卷积核大小

padding 数量

stride 的步长

dilation 的间隔

这些参数的释义如果有疑惑可以参考下面的博客。

卷积层的权重怎么更新 卷积层参数数量_卷积核

H和W的计算是对称的,所以这里只讨论W就足够了。

下图是一个5*5的矩阵和它在3*3权重全为1的卷积核下卷积的结果。默认情况下,P=0,S=1,卷积核从左往右挪动,到红框这个位置就得停下来。此时很容易可以看出卷积核只能移动 W-FW+1次,所以宽度当然就是 W-FW+1

卷积层的权重怎么更新 卷积层参数数量_pytorch_02

padding相当于延长了H和W,因为padding在上,下,左,右四个方向都会有添加,所以padding带来的影响是双倍的。所以考虑padding之后宽度是 W+2P-FW+1。

接下来考虑S,从上面的讨论中,卷积核最多只能移动到原图像的第 W+2P-FW+1列。当步长为1时,移动的次数为  W+2P-FW 次(从1到x一共x-1个间隔),而feature map的宽度为移动次数+1。步长为S时 移动的次数就要相应的除以S,最终再加上1就是生成的feature map的宽度。

dilation 增大了卷积核在原图像上的采样间隔,实际上也就是增大了卷积核的大小。

卷积层的权重怎么更新 卷积层参数数量_卷积核_03

上图中方格表示dilation=1(即没有间隔)时的卷积核在原图像对应的采样点,小圆圈表示dilation为x时插入的x-1个间隔。当卷积核宽度为FW时,插入的间隔数量一共为  (FH-1)*(dilation-1)。这也就相当于将FH增大了这么多。