torch.nn.functional.pad是PyTorch内置的矩阵填充函数
(1).torch.nn.functional.pad函数详细描述如下:
torch.nn.functional.pad(input, pad, mode,value )
Args:
"""
input:四维或者五维的tensor Variabe
pad:不同Tensor的填充方式
1.四维Tensor:传入四元素tuple(pad_l, pad_r, pad_t, pad_b),
指的是(左填充,右填充,上填充,下填充),其数值代表填充次数
2.六维Tensor:传入六元素tuple(pleft, pright, ptop, pbottom, pfront, pback),
指的是(左填充,右填充,上填充,下填充,前填充,后填充),其数值代表填充次数
mode: ’constant‘, ‘reflect’ or ‘replicate’三种模式,指的是常量,反射,复制三种模式
value:填充的数值,在"contant"模式下默认填充0,mode="reflect" or "replicate"时没有
value参数
"""
(2).代码演示(举个四维Tensor填充的例子)
1.获取一个shape=(2,1,3,2)的随机数矩阵
import torch
import torch.nn.functional as F
original_values = torch.randn([2,1, 3, 2])
print("original_values: ",original_values,"\n")
print("original_values的shape: ",original_values.shape)
显示结果:
original_values: tensor([[[[ 0.8182, -1.2295],
[ 0.1985, 1.2261],
[-2.1763, -0.5790]]],
[[[ 0.4204, 1.5903],
[ 1.6354, -2.7076],
[ 0.6119, 1.4595]]]])
original_values的shape: torch.Size([2, 1, 3, 2])
2.进行左填充,pad=(1,0,0,0,0,0),在第四个维度填充
padding_values = F.pad(original_values, pad=(1,0,0,0,0,0), mode="constant",value=0)
print("padding_values: ",padding_values,"\n")
print("padding_values的shape: ",padding_values.shape)
显示结果1(mode=“constant”):
在mode="constant"的padding_values: tensor([[[[ 0.0000, 0.8182, -1.2295],
[ 0.0000, 0.1985, 1.2261],
[ 0.0000, -2.1763, -0.5790]]],
[[[ 0.0000, 0.4204, 1.5903],
[ 0.0000, 1.6354, -2.7076],
[ 0.0000, 0.6119, 1.4595]]]])
padding_values的shape: torch.Size([2, 1, 3, 3])
显示结果二2(mode=“reflect”):
在mode="reflect"的padding_values: tensor([[[[-1.2295, 0.8182, -1.2295],
[ 1.2261, 0.1985, 1.2261],
[-0.5790, -2.1763, -0.5790]]],
[[[ 1.5903, 0.4204, 1.5903],
[-2.7076, 1.6354, -2.7076],
[ 1.4595, 0.6119, 1.4595]]]])
padding_values的shape: torch.Size([2, 1, 3, 3])
显示结果三(mode=“replicate”):
在mode="replicate"的padding_values: tensor([[[[ 0.8182, 0.8182, -1.2295],
[ 0.1985, 0.1985, 1.2261],
[-2.1763, -2.1763, -0.5790]]],
[[[ 0.4204, 0.4204, 1.5903],
[ 1.6354, 1.6354, -2.7076],
[ 0.6119, 0.6119, 1.4595]]]])
padding_values的shape: torch.Size([2, 1, 3, 3])
3.进行左填充,pad=(2,0,0,0,0,0),在第四个维度填充
padding_values = F.pad(original_values, pad=(2,0,0,0,0,0), mode="constant",value=0)
print("padding_values: ",padding_values,"\n")
print("padding_values的shape: ",padding_values.shape)
显示结果(mode=“constant”):
padding_values: tensor([[[[ 0.0000, 0.0000, 0.8182, -1.2295],
[ 0.0000, 0.0000, 0.1985, 1.2261],
[ 0.0000, 0.0000, -2.1763, -0.5790]]],
[[[ 0.0000, 0.0000, 0.4204, 1.5903],
[ 0.0000, 0.0000, 1.6354, -2.7076],
[ 0.0000, 0.0000, 0.6119, 1.4595]]]])
padding_values的shape: torch.Size([2, 1, 3, 4])
4.进行右填充,pad=(0,1,0,0,0,0),在第四个维度填充
padding_values = F.pad(original_values, pad=(0,1,0,0,0,0), mode="constant",value=0)
print("padding_values: ",padding_values)
print("padding_values的shape: ",padding_values.shape)
显示结果(mode=“constant”):
padding_values: tensor([[[[ 0.8182, -1.2295, 0.0000],
[ 0.1985, 1.2261, 0.0000],
[-2.1763, -0.5790, 0.0000]]],
[[[ 0.4204, 1.5903, 0.0000],
[ 1.6354, -2.7076, 0.0000],
[ 0.6119, 1.4595, 0.0000]]]])
padding_values的shape: torch.Size([2, 1, 3, 3])
5.进行上填充,pad=(0,0,1,0,0,0),在第三个维度填充
padding_values = F.pad(original_values, pad=(0,0,1,0,0,0), mode="constant",value=0)
print("padding_values: ",padding_values)
print("padding_values的shape: ",padding_values.shape)
显示结果(mode=“constant”):
padding_values: tensor([[[[ 0.0000, 0.0000],
[ 0.8182, -1.2295],
[ 0.1985, 1.2261],
[-2.1763, -0.5790]]],
[[[ 0.0000, 0.0000],
[ 0.4204, 1.5903],
[ 1.6354, -2.7076],
[ 0.6119, 1.4595]]]])
padding_values的shape: torch.Size([2, 1, 4, 2])
6.进行下填充,pad=(0,0,0,1,0,0),在第三个维度填充
padding_values = F.pad(original_values, pad=(0,0,0,1,0,0), mode="constant",value=0)
print("padding_values: ",padding_values)
print("padding_values的shape: ",padding_values.shape)
显示结果(mode=“constant”):
padding_values: tensor([[[[ 0.8182, -1.2295],
[ 0.1985, 1.2261],
[-2.1763, -0.5790],
[ 0.0000, 0.0000]]],
[[[ 0.4204, 1.5903],
[ 1.6354, -2.7076],
[ 0.6119, 1.4595],
[ 0.0000, 0.0000]]]])
padding_values的shape: torch.Size([2, 1, 4, 2])
7.进行前填充,此时pad=(0,0,0,0,1,0),在第二个维度上填充
padding_values = F.pad(original_values, pad=(0,0,0,0,1,0), mode="constant",value=0)
print("padding_values: ",padding_values)
print("padding_values的shape: ",padding_values.shape)
显示结果(mode=“constant”):
padding_values: tensor([[[[ 0.0000, 0.0000],
[ 0.0000, 0.0000],
[ 0.0000, 0.0000]],
[[ 0.8182, -1.2295],
[ 0.1985, 1.2261],
[-2.1763, -0.5790]]],
[[[ 0.0000, 0.0000],
[ 0.0000, 0.0000],
[ 0.0000, 0.0000]],
[[ 0.4204, 1.5903],
[ 1.6354, -2.7076],
[ 0.6119, 1.4595]]]])
padding_values的shape: torch.Size([2, 2, 3, 2])
8.进行后填充,此时pad=(0,0,0,0,1,0),在第二个维度上填充
padding_values = F.pad(original_values, pad=(0,0,0,0,0,1), mode="constant",value=0)
print("padding_values: ",padding_values)
print("padding_values的shape: ",padding_values.shape)
显示结果(mode=“constant”):
padding_values: tensor([[[[ 0.8182, -1.2295],
[ 0.1985, 1.2261],
[-2.1763, -0.5790]],
[[ 0.0000, 0.0000],
[ 0.0000, 0.0000],
[ 0.0000, 0.0000]]],
[[[ 0.4204, 1.5903],
[ 1.6354, -2.7076],
[ 0.6119, 1.4595]],
[[ 0.0000, 0.0000],
[ 0.0000, 0.0000],
[ 0.0000, 0.0000]]]])
padding_values的shape: torch.Size([2, 2, 3, 2])