最近在看Pix2PixHD的源码时,发现里面有几处用了nn.ReflectionPad2d()这个函数,查阅了官方文档和网上的资料后,终于弄明白了这个函数的用处。
函数用途:对输入图像以最外围像素为对称轴,做四周的轴对称镜像填充。
填充顺序:左->右->上->下
对于一个4维的Tensor,当只指定一个padding参数时,则表示对四周采用相同的填充行数。
# 对四周都填充3行
nn.ReflectionPad2d(3)
以下为计算实例:
>>> a = tensor([[[[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 3., 1.],
[1., 3., 4., 5., 1.],
[1., 1., 1., 1., 1.]]]])
>>> p = nn.ReflectionPad2d(3)
>>> p(a) = tensor([[[[5., 4., 3., 1., 3., 4., 5., 1., 5., 4., 3.],
[3., 1., 1., 1., 1., 1., 3., 1., 3., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[3., 1., 1., 1., 1., 1., 3., 1., 3., 1., 1.],
[5., 4., 3., 1., 3., 4., 5., 1., 5., 4., 3.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[5., 4., 3., 1., 3., 4., 5., 1., 5., 4., 3.],
[3., 1., 1., 1., 1., 1., 3., 1., 3., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]]]])
将上述运算过程用图示形式表示,以左侧填充3列像素为例,褐色虚线框内为原始Tensor:
若分别对4个维度进行不同行数的填充,则需分别指定填充参数。
# 左侧填充1行,右侧填充2行,上方填充3行,下方填充2行
nn.ReflectionPad2d((1, 2, 3, 2))