pytorch笔记:torch.nn.functional.pad

1 torch.nn.functional.pad函数

        torch.nn.functional.pad是pytorch内置的tensor扩充函数,便于对数据集图像或中间层特征进行维度扩充

torch.nn.functional.pad(
    input, 
    pad, 
    mode='constant', 
    value=0)

2 参数说明

input 需要扩充维度的tensor
pad 扩充维度,用于预先定义出某维度上的扩充参数
mode 扩充方法,’constant‘, ‘reflect’ or ‘replicate’三种模式,分别表示常量,反射,复制
value

扩充时指定补充值

        但是value只在mode='constant’有效,即使用value填充在扩充出的新维度位置,而在’reflect’和’replicate’模式下,value不可赋值

3 逐维理解torch.nn.functional.pad

        为了方便从可视角度上分析torch.nn.functional.pad的实际效果,我们首先给出一个四维的空值矩阵。【维度分别代表(batchsize, channel, height, width)】

import torch
import torch.nn.functional as F

t = torch.empty(1, 3, 5, 3)
t.size()

'''
torch.Size([1, 3, 5, 3])
'''

3.1 扩展一个维度

我们先只观察t的最后两维,即一个5行3列的矩阵

pytorch笔记:torch.nn.functional.pad_第1张图片

         如果torch.nn.functional.pad中第二个参数pad只定义两个参数,表示只对输入矩阵的最后一个维度进行扩充,不会对前面的维度造成任何影响

import torch
import torch.nn.functional as F

t = torch.empty(1, 3, 5, 3)
t.size()
'''
torch.Size([1, 3, 5, 3])
'''

p1d = (1, 2)
t1 = F.pad(t, p1d, 'constant', 1)
t1.size()
'''
torch.Size([1, 3, 5, 6])
'''

        接下来,从可视化的角度分析一下一维padding。为了方便理解,原始矩阵全为0值,扩充维度全部用1值填充:

pytorch笔记:torch.nn.functional.pad_第2张图片

        通过上图我们可以看到,经过torch.nn.functional.pad后 左侧扩充了1列,右侧扩充了2列,即原始矩阵大小从5×3扩充到5×6,则p1d的参数设置意义为:(左边填充数, 右边填充数)

3.2 扩展两个维度

import torch
import torch.nn.functional as F

t = torch.empty(1, 3, 5, 3)
t.size()
'''
torch.Size([1, 3, 5, 3])
'''

p2d = (1, 2, 3, 4)
t2 = F.pad(t4d, p2d, 'constant', 2)
t2.size()
'''
torch.Size([1, 3, 12, 6])
'''

同样地,我们可视化看一下效果:

pytorch笔记:torch.nn.functional.pad_第3张图片

可以看到,维度左边扩充了一列,右侧扩充了2列;上边扩充了3行,下边扩充了4行。

也就是说,前两个参数对最后一个维度有效,后两个参数对倒数第二维有效。

换句话说,p2d参数的实际意义是:(左边填充数, 右边填充数, 上边填充数, 下边填充数)

 3.3 扩展三个维度

import torch
import torch.nn.functional as F

t = torch.empty(1, 3, 5, 3)
t.size()
'''
torch.Size([1, 3, 5, 3])
'''

p3d = (1, 2, 3, 4, 5, 6)
t3 = F.pad(t4d, p3d, 'constant', 3)
t3.size()
'''
torch.Size([1, 14, 12, 6])
'''

同样进行可视化 

pytorch笔记:torch.nn.functional.pad_第4张图片

可以看到,前面扩展了5个维度,后面6个维度

所以p3d的实际意义是:(左边填充数, 右边填充数, 上边填充数, 下边填充数, 前边填充数,后边填充数)

4 总结

 也就是说,pad参数的意思是:从最后一个维度开始,维度一前一后扩展]

参考文献:PyTorch碎片:F.pad的图文透彻理解_面壁者-CSDN博客_f.pad

你可能感兴趣的:(pytorch学习,pytorch,深度学习,神经网络)