pytorch中padding应用总结

        卷积操作作为卷积神经网络的核心模块,在其计算过程中必须考虑图像“边缘像素”的卷积方式。查阅资料发现,我们可以采用“卷积之前进行边界填充”或“卷积之后进行边界填充两种方式”,同时边界填充的具体手段包含常量填充、零填充、镜像填充以及重复填充等。

        padding 的操作就是在图像块的周围加上格子, 从而使得图像经过卷积过后按照预期大小变化,这种操作是使得图像的边缘数据也能得到利用,以更好地扩张整张图像的边缘特征。

        卷积操作的输出大小如上式所示,需要注意的是,当前面一部分不能整除时,卷积操作的输出为上式向下取整(也就是四舍五入)的结果,而池化操作的计算结果为向上取整(即进一位)

        卷积核中size的选择可能会导致input中的某几行(或者最后 几行)没有关联起来,这个可能是因为我们使用的模式是valid(即不填充边缘),而不是same。

        TensorFlow中的padding取值为valid对应pytorch中取值为1;TensorFlow中的padding取值为same对应pytorch中取值为0。

        【举个例子】输入信号的格式:(N, C, H, W),其中N表示Batch size,C表示channel,H和W分别表示特征图的高和宽。

        在nn.Conv2d中padding可以补0操作,也可补其他的。

        padding=(1,1):第一个参数表示在高度上面的padding,第二个参数表示在宽度上面的padding。如下图:

填充完值不是0 ,而是0.9862,是因为其加上了偏置值0.9862 

扫描二维码关注公众号,回复: 14854265 查看本文章

 pytorch中默认的padding类型是vaild


创建一个2dTensor用于测试后面的填充操作:

x = torch.Tensor([[1, 2], [3, 4]])

1、零填充 ZeroPad2d

        最常用的是nn.ZeroPad2d,也就是对Tensor使用0进行边界填充,我们可以指定tensor的四个方向上的填充数,比如左边添加1列、右边添加2列、上边添加3行、下边添加4行,即指定paddin参数为(1,2,3,4),如下:

pad = nn.ZeroPad2d(padding=(1, 2, 3, 4))

y = pad(x)

得到的y是x在四个方向上按照(1,2,3,4)进行的补零操作,如下图:

2、常数填充 ConstantPad2d

        零填充是常数填充的一个特例,常数填充nn.ConstantPad2d()需要我们指定填充所用的常数值value核填充数padding,这里选择四个方向上均填充为1行或者列,即padding为(1,1,1,1),代码如下:

pad = nn.ConstantPad2d(padding=(1, 1, 1, 1), value=666)

y = pad(x)

得到的y在四周分别用666进行填充:

3、镜像填充ReflectionPad2d

        镜像填充的方式相比于前面使用固定数值进行填充,有可能获得更好的卷积结果。镜像填充封装在nn.ReflectionPad2d中,其填充方式为新的行或列值使用反方向的最下边元素的值,代码如下:

pad = nn.ReflectionPad2d(padding=(1, 1, 1, 1))

y = pad(x) 

从下图结果可以看出第一行第一列的4是原来右下角的4,第一行第二列的3原来左下角的3:

4、重复填充ReplicationPad2d

重复填充即重复图像的边缘像素值,将新的边界像素值用边缘像素值扩展,封装于nn.ReplicationPad2d()中,同样可以指定4个方向的填充数量:

pad = nn.ReplicationPad2d(padding=(1, 1, 1, 1))

y = pad(x)

从下图得到的结果可以看出,填充后边界像素值是原来的1、2、3、4的复制:

        pytorch是在卷积之前进行padding,并且填充方式的选择对于图像较小的情况下比较重要,对于尺寸较大的图像来说如何填充影响可能并不大。 

 参考pytorch必须掌握的4种边界Padding方法 - 知乎 (zhihu.com)

猜你喜欢

转载自blog.csdn.net/baidu_41774120/article/details/129156863
今日推荐