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列的矩阵
如果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值填充:
通过上图我们可以看到,经过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])
'''
同样地,我们可视化看一下效果:
可以看到,维度左边扩充了一列,右侧扩充了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])
'''
同样进行可视化
可以看到,前面扩展了5个维度,后面6个维度
所以p3d的实际意义是:(左边填充数, 右边填充数, 上边填充数, 下边填充数, 前边填充数,后边填充数)
4 总结
也就是说,pad参数的意思是:从最后一个维度开始,维度一前一后扩展]