Pytorch学习之torch.nn.functional.pad()函数

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值