PyTorch学习之torch.nn.functional.pad函数
一、简介
torch.nn.functional.pad
是 PyTorch 中用于对张量进行填充操作的函数。填充操作在处理图像、序列数据等任务时非常常见,它可以在张量的指定维度两端添加一定数量的元素,填充方式多样,包括零填充、常数填充、反射填充和边界填充等。
二、基本语法
torch.nn.functional.pad(input, pad, mode='xxx', value=x)
三、参数说明
input
(Tensor): 输入的张量。pad
(tuple): 指定每个维度填充的数目。格式为 (left, right, top, bottom, …)。mode
(str, 可选): 填充模式,包括constant
(常数填充,默认)、reflect
(反射填充)、replicate
(边界填充)和circular
(循环填充)。value
(float, 可选): 常数填充模式下填充值,仅当mode
为 ‘constant’ 时有效,其他模式时即使指定了值也会被忽略掉。
四、返回值
返回一个新的张量,对输入张量进行了指定方式的填充。
五、填充模式详解
在详细讲解和演示每一种模式的效果前,我想对填充的一些规则进行提前说明:
-
我们会填充【 d i m = l e n ( p a d ) 2 \mathrm{dim=\frac{len(pad)}{2}} dim=2len(pad)】个维度
举个例子:有一个
(4, 4)
形状的矩阵,我给的pad=(1,1)
,那么根据公式 d i m = 2 2 = 1 \mathrm{dim=\frac22=1} dim=22=1因此我们只填充1个维度。有人想,既然只填充1个维度,那为什么给两个值?矩阵是4x4的,有横向有纵向对吧,最后一个维度肯定是横向的(我们常说矩阵存储是行优先的),此时矩阵是不是有左右两边?那么给出的2个填充值分别对应于在左边(left)要填充1个像素,在右边(right)要填充一个像素。
同样的随着维度扩展,pad可以提供更长的参数,如
pad=(1, 1, 2, 2, 3, 3)
,根据公式填充3个维度,哪3个?(left, right, top, bottom, front, back)
-
填充是
从内向外
的:例如pad=(1, 1, 2, 2, 3, 3)
,(1, 1)对应填充(left, right),(2, 2)对应填充(top, bottom),(3, 3)对应填充(front, back)
5.1 constant模式
在该模式下,我们必须指定参数value
,value的值将填充到我们扩充的区域。
例如有如下代码:
import torch
import torch.nn as nn
data = torch.tensor([[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]])
print(data.size())
print(data)
paddata1 = nn.functional.pad(data, (1, 1, 1, 1), mode="constant", value=1)
print(paddata1.size())
print(paddata1)
输出:
torch.Size([1, 4, 4])
tensor([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]])
torch.Size([1, 6, 6])
tensor([[[ 1, 1, 1, 1, 1, 1],
[ 1, 1, 2, 3, 4, 1],
[ 1, 5, 6