pytorch必须掌握的4种边界Padding方法

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

在具体分析各种Pad之前,先创建一个2dTensor用于测试后面的填充操作:

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

创建的Tensor数值分别1、2、3、4:


1、零填充ZeroPad2d

我们最常用的是nn.ZeroPad2d,也就是对Tensor使用0进行边界填充,我们可以指定tensor的四个方向上的填充数,比如左边添加1dim、右边添加2dim、上边添加3dim、下边添加4dim,即指定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,这里选择四个方向上均填充为1dim,即padding为(1,1,1,1),代码如下:

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

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


3、镜像填充ReflectionPad2d

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

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这个问题,根据【1】中所述,应该是卷积之前进行的填充;上文中dim并不是维度的意思,自己没有找到合适的词描述添加的“行或列”,就用了dim一词;填充方式的选择对于图像较小的情况下比较重要,对于尺寸较大的图像来说如何填充影响可能并不大。

参考:

【1】discuss.pytorch.org/t/d

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch提供了一方便的方法来对张量进行填充padding)。填充是在张量的边界周围添加额外的值,从而改变其形状或尺寸。在PyTorch中,可以使用torch.nn.functional中的pad函数来进行填充操作。 pad函数的使用方式如下: ```python import torch.nn.functional as F padded_tensor = F.pad(input_tensor, pad, mode='constant', value=0) ``` 其中,参数解释如下: - input_tensor:需要进行填充操作的输入张量。 - pad:填充值的大小。可以是单个整数,表示在所有维度上应用相同大小的填充;也可以是一个元组,表示在各个维度上应用不同的填充大小。 - mode:填充模式。可选的模式包括'constant'(常数填充,默认值)、'reflect'(反射填充)和'replicate'(复制填充)。 - value:用于常数填充时所使用的常数值,默认为0。 以下是一个使用pad函数进行填充的示例: ```python import torch import torch.nn.functional as F input_tensor = torch.tensor([[1, 2], [3, 4]]) pad = (1, 2, 0, 0) # 在第一个维度前面填充1个元素,在第一个维度后面填充2个元素,在第二个维度前面和后面都不填充 padded_tensor = F.pad(input_tensor, pad, mode='constant', value=0) print(padded_tensor) ``` 输出结果为: ``` tensor([[0, 0, 0], [1, 2, 0], [3, 4, 0], [0, 0, 0]]) ``` 在这个示例中,输入张量input_tensor的形状为(2, 2),通过填充操作,得到了一个形状为(4, 3)的填充后张量padded_tensor。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值