图像卷积中各参数的关系和实现

转自:关于卷积过程的思考: - 知乎 (zhihu.com)

https://www.zhihu.com/question/474159106/answer/2014764112

一. pytorch的默认机制.

如果卷积核在按照步长移动的过程中, 遇到像素数不能被步长整除的情况, 那么此时与卷积步长不能对齐的边缘像素默认会被直接扔掉.(公式中的分母会变小.)

二. 经验之谈:

  1. 在没有padding, 步长为1的情况下, 卷积后的尺寸在长宽方向的尺寸损失为(kernal_size-1), 416*416的图像经过7*7卷积后, 长/宽尺寸损失为6, 结果尺寸为410; 如果是417*417的图像, 卷积结果就为411. 此时如果要保持卷积前后的尺寸不变, 就得在卷积前的图像四周各填充3个像素(padding=3), 以弥补卷积带来的尺寸损失.
  2. 同上, 如果步长为2, 会存在步长和像素不能对齐的情况, 这时在pytorch机制下会丢弃不能对齐的像素.416的图像那就是205; 417的图像就是206. 根据经验, 相当于就是步长为1时输出的结果直接除2, 如果有小数就向上取整得到.
  3. 按公式推[(in_size−kernal_size)/strides]+1=out_size 就是公式第一项(416-7) /2=204.5在pytorch机制下得204, 公式第二项"+1"得205; (417-7) /2可以整除无损失得205, 再+1得206.
  4. 说白了就是在步长为2的情况下, 公式第一项即使有像素损失, 也只会损失1排/列(分母-1). 而公式第二项"+1"在strides=2时映射到原图的尺寸为2, 相比原来增加了1排/列(分母+1), 所以说strides=2带来的分母对齐损失与其带来尺寸增益抵消了.
  5. 结论:
  • 当strides=2, 有对齐损失时, 这时strides能直接被strides=1时的out_size(410)整除, strides=2的卷积结果为strides=1时的结果尺寸的一半.
  • 当strides=2, 没有对齐损失时, 这时strides不能被strides=1时的out_size(411)整除, 卷积结果为strides=1时的结果尺寸的一半+1.

三. 速算:

图片448, 卷积9, 尺寸损失为8, 卷积之后的图片440, 如果步长为2, 卷积结果220.

图片445, 卷积9, 尺寸损失为8, 卷积之后的图片437, 如果步长为2, 卷积结果219.

图片608, 卷积11, 尺寸损失为10, 卷积结果598, 如果步长为2, 卷积结果299.

图片13, 卷积9, 尺寸损失为8, 卷积之后的图片5, 如果步长为2, 卷积结果3.

四. strides和kernal_size:

  1. 会造成像素被丢弃的是strides而不是kernal_size.
  2. 只要kernal_size不超过图像尺寸, kernal_size再怎么大, 如果strides为1, 也不会有像素被丢弃, 所有像素都会被收集和处理. kernal_size再怎么小, 比如为1, 如果此时strides很大, 比如为10, 那么最后一步的像素数如果没有达到10, 整个一大段就都会被抛弃.(这种情况类似于最邻近元法下采样, 下采样就必然带来信息的损失. 而不仅仅是边缘像素的对齐损失.)

五. 图像卷积

通道数变化代表卷积核的个数。比如输入图像维度为 28x28x3 ,5x5的卷积核会作用于RGB这三维,每次算出三个数再求和或取平均为一个数,假设此时不做padding,那么维度就变成24x24x1,说明使用了1个5x5x3的卷积核进行卷积操作。如果使用n个5x5x3的卷积核进行卷积操作,那么输出就是 24x24xn。

看这张图,输入时6x6x3的图像。分别过黄色和橙色两个3x3x3的卷积核,会得到两个4x4x1的输出,也就是4x4x2的输出。

 六.nn.Conv2d

根据PyTorch官方的解释:

CLASS    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)

其中groups参数可能较难理解,解释如下。

groups:分组卷积

Convolution 层的参数中有一个group参数,其意思是将对应的输入通道与输出通道数进行分组, 默认值为1, 也就是说默认输出输入的所有通道各为一组。比如输入数据大小为90x100x100x32,通道数32,要经过一个48*3x3x32的卷积,group默认是1,就是全连接的卷积层。

如果group是2,那么对应要将输入的32个通道分成2个16的通道,将输出的48个通道分成2个24的通道。对输出的2个24的通道,第一个24通道与输入的第一个16通道进行全卷积,第二个24通道与输入的第二个16通道进行全卷积。极端情况下,输入输出通道数相同,比如为24,group大小也为24,那么每个输出卷积核,只与输入的对应的通道进行卷积。

参考:nn.Conv2d中groups参数的理解 - 知乎 (zhihu.com)

posted @ 2022-12-25 00:51  实数集  阅读(323)  评论(0)    收藏  举报