Pytorch四种填充模式详解


Torch在做二维卷积或者一维卷积的时候,有四种常用的填充方式,即torch.nn.Conv2D(padding_model=”zeros”),下面进行详细的介绍。
首先生成一个tensor矩阵:
x=nn.Parameter(torch.reshape(torch.range(1,9),(1,1,3,3)))
x的结果为:tensor([[[[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]]]], requires_grad=True)
下面在(1,1)的卷积核,padding=1的前提下,使用不同的填充方式进行对比分析。
1、zeros
‘zeros’填充是比较常用的填充方法,在矩阵的每个维度两边用0进行填充。
tensor([[[[0., 0., 0., 0., 0.],
[0., 1., 2., 3., 0.],
[0., 4., 5., 6., 0.],
[0., 7., 8., 9., 0.],
[0., 0., 0., 0., 0.]]]], grad_fn=<ThnnConv2DBackward>)
2、reflect
‘reflect’是以矩阵的边缘为对称轴,进行填充。
tensor([[[[5., 4., 5., 6., 5.],
[2., 1., 2., 3., 2.],
[5., 4., 5., 6., 5.],
[8., 7., 8., 9., 8.],
[5., 4., 5., 6., 5.]]]], grad_fn=<ThnnConv2DBackward>)
3、replicate
‘replicate’是将矩阵的边缘复制进行填充。
tensor([[[[1., 1., 2., 3., 3.],
[1., 1., 2., 3., 3.],
[4., 4., 5., 6., 6.],
[7., 7., 8., 9., 9.],
[7., 7., 8., 9., 9.]]]], grad_fn=<ThnnConv2DBackward>)
4、circular
‘circular’就是从上到下,从左到右循环复制填充。
tensor([[[[9., 7., 8., 9., 7.],
[3., 1., 2., 3., 1.],
[6., 4., 5., 6., 4.],
[9., 7., 8., 9., 7.],
[3., 1., 2., 3., 1.]]]], grad_fn=<ThnnConv2DBackward>)
如果将Padding设置为3,则:
tensor([[[[1., 2., 3., 1., 2., 3., 1., 2., 3.],
[4., 5., 6., 4., 5., 6., 4., 5., 6.],
[7., 8., 9., 7., 8., 9., 7., 8., 9.],
[1., 2., 3., 1., 2., 3., 1., 2., 3.],
[4., 5., 6., 4., 5., 6., 4., 5., 6.],
[7., 8., 9., 7., 8., 9., 7., 8., 9.],
[1., 2., 3., 1., 2., 3., 1., 2., 3.],
[4., 5., 6., 4., 5., 6., 4., 5., 6.],
[7., 8., 9., 7., 8., 9., 7., 8., 9.]]]],
grad_fn=<ThnnConv2DBackward>)
可以看到前者是后者的截取。