PyTorch之F.pad的使用与报错记录

这篇具有很好参考价值的文章主要介绍了PyTorch之F.pad的使用与报错记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

F.pad的使用与报错记录

原始文档:https://www.yuque.com/lart/ugkv9f/iftd9v

函数原型

函数文档:https://pytorch.org/docs/1.12/generated/torch.nn.functional.pad.html#torch-nn-functional-pad

torch.nn.functional.pad(input, pad, mode='constant', value=None) → Tensor

Padding格式

  • 1D-tensor:(p_left, p_right)
  • 2D-tensor:(p_left, p_right, p_top, p_bottom)
  • 3D-tensor:(p_left, p_right, p_top, p_bottom, p_front, p_back)

四种模式

这一函数用于实现对高维tensor的形状补齐操作。PyTorch本身提供了四种padding模式:

  • constant:使用指定的常数value补齐指定的维度。对于数据012,使用0补齐,结果可以为0001200
  • reflect:使用tensor自身的值按照“反射”的方式补齐指定的维度。对于数据012,结果可以为2101210
  • replicate:使用tensor自身边界值补齐指定的维度。对于数据012,结果可以为0001222
  • circular:使用tensor自身的值按照“循环”的方式补齐指定的维度。对于数据012,结果可以为1201201

需要注意的是,文档强调了这一点:

Constant padding is implemented for arbitrary dimensions.
Replicate and reflection padding are implemented for padding the last 3 dimensions of a 4D or 5D input tensor, the last 2 dimensions of a 3D or 4D input tensor, or the last dimension of a 2D or 3D input tensor.

这四种模式使用输出展示会更便于理解一些,下面是一个例子:

import torch
import torch.nn.functional as F

pad = [2, 2, 2, 2]
x = torch.arange(9, dtype=torch.float32).reshape(1, 1, 3, 3)

print("x")
print(x)

print("F.pad(x, pad=pad, mode='constant', value=0)")
print(F.pad(x, pad=pad, mode='constant', value=0))

print("F.pad(x, pad=pad, mode='replicate')")
print(F.pad(x, pad=pad, mode='replicate'))

print("F.pad(x, pad=pad, mode='reflect')")
print(F.pad(x, pad=pad, mode='reflect'))

print("F.pad(x, pad=pad, mode='circular')")
print(F.pad(x, pad=pad, mode='circular'))

对应的输出为:

x
tensor([[[[0., 1., 2.],
          [3., 4., 5.],
          [6., 7., 8.]]]])
F.pad(x, pad=pad, mode='constant', value=0)
tensor([[[[0., 0., 0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0., 0., 0.],
          [0., 0., 0., 1., 2., 0., 0.],
          [0., 0., 3., 4., 5., 0., 0.],
          [0., 0., 6., 7., 8., 0., 0.],
          [0., 0., 0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0., 0., 0.]]]])
F.pad(x, pad=pad, mode='replicate')
tensor([[[[0., 0., 0., 1., 2., 2., 2.],
          [0., 0., 0., 1., 2., 2., 2.],
          [0., 0., 0., 1., 2., 2., 2.],
          [3., 3., 3., 4., 5., 5., 5.],
          [6., 6., 6., 7., 8., 8., 8.],
          [6., 6., 6., 7., 8., 8., 8.],
          [6., 6., 6., 7., 8., 8., 8.]]]])
F.pad(x, pad=pad, mode='reflect')
tensor([[[[8., 7., 6., 7., 8., 7., 6.],
          [5., 4., 3., 4., 5., 4., 3.],
          [2., 1., 0., 1., 2., 1., 0.],
          [5., 4., 3., 4., 5., 4., 3.],
          [8., 7., 6., 7., 8., 7., 6.],
          [5., 4., 3., 4., 5., 4., 3.],
          [2., 1., 0., 1., 2., 1., 0.]]]])
F.pad(x, pad=pad, mode='circular')
tensor([[[[4., 5., 3., 4., 5., 3., 4.],
          [7., 8., 6., 7., 8., 6., 7.],
          [1., 2., 0., 1., 2., 0., 1.],
          [4., 5., 3., 4., 5., 3., 4.],
          [7., 8., 6., 7., 8., 6., 7.],
          [1., 2., 0., 1., 2., 0., 1.],
          [4., 5., 3., 4., 5., 3., 4.]]]])

可能会遇到的报错

常见的错误主要是因为padding的数量超过了对应模式的要求。

对于constantreplicate对于padding并没有限制。

但是另外两种模式replicatecircular就有要求了。

RuntimeError: Argument #4: Padding size should be less than the corresponding input dimension, but got: padding (3, 3) at dimension 3 of input 4

这发生在reflect模式中,padding的数量必须小于对应维度的大小。

import torch
import torch.nn.functional as F

pad = [3, 3, 3, 3]
x = torch.arange(9, dtype=torch.float32).reshape(1, 1, 3, 3)

print("F.pad(x, pad=pad, mode='reflect')")
print(F.pad(x, pad=pad, mode='reflect'))

"""
F.pad(x, pad=pad, mode='reflect')
Traceback (most recent call last):
  File "e:/Coding/PythonTools/TorchPadding/main.py", line 20, in <module>
    print(F.pad(x, pad=pad, mode='reflect'))
  File "D:\Programming\Python\envs\pt1102\lib\site-packages\torch\nn\functional.py", line 4189, in _pad
    return torch._C._nn.reflection_pad2d(input, pad)
RuntimeError: Argument #4: Padding size should be less than the corresponding input dimension, but got: padding (3, 3) at 
dimension 3 of input 4
"""

这一错误仔细思考一下其实也可以理解,因为对于序列012,如果在右侧reflect padding 3位,对于前两位可以直观的获得即为10,但是第三位如何获取就属于未明确定义的问题了。为了解决这个问题,则需要自定义一种规则。

如果我们定义reflect按照三角波的形状周期重复,则扩展后的序列可以设计为:...20121+012+101210...
此时我们则可以直接使用多次reflect padding来等价实现:

x = torch.arange(9, dtype=torch.float32).reshape(1, 1, 3, 3)
print("F.pad(x, pad=pad, mode='reflect')")

# this `pad` will raise an error
# pad = [3, 3, 3, 3]
# print("pad=", pad)
# print(F.pad(x, pad=pad, mode='reflect'))

# let's use a indirect method to imitate `pad = [3, 3, 3, 3]`
pad = [2, 2, 2, 2]
x = F.pad(x, pad=pad, mode='reflect')
pad = [1, 1, 1, 1]
x = F.pad(x, pad=pad, mode='reflect')
print(x)

此时输出:

F.pad(x, pad=pad, mode='reflect')
tensor([[[[4., 5., 4., 3., 4., 5., 4., 3., 4.],
          [7., 8., 7., 6., 7., 8., 7., 6., 7.],
          [4., 5., 4., 3., 4., 5., 4., 3., 4.],
          [1., 2., 1., 0., 1., 2., 1., 0., 1.],
          [4., 5., 4., 3., 4., 5., 4., 3., 4.],
          [7., 8., 7., 6., 7., 8., 7., 6., 7.],
          [4., 5., 4., 3., 4., 5., 4., 3., 4.],
          [1., 2., 1., 0., 1., 2., 1., 0., 1.],
          [4., 5., 4., 3., 4., 5., 4., 3., 4.]]]])

当然还有一个更一般的实现,这里实际上还存在优化的空间,不过作为参考而言已经足够:

import torch
import torch.nn.functional as F

def infinite_reflect_padding(x: torch.Tensor, pad: tuple) -> torch.Tensor:
    """Padding with reflect mode that breaks the limit.

    Args:
        x (torch.Tensor): Input tensor.
        pad (tuple): Padding tuple: left, right, top, bottom

    Returns:
        torch.Tensor: Padded tensor.
    """
    B, C, H, W = x.shape
    assert len(pad) == 4
    if W == 1:
        # must not pad the tensor.
        if not (pad[0] == 0 and pad[1] == 0):
            raise ValueError(pad)
    if H == 1:
        # must not pad the tensor.
        if not (pad[2] == 0 and pad[3] == 0):
            raise ValueError(pad)
    base_pad = [W-1, W-1, H-1, H-1]

    first_padding = []
    other_padding = []
    for p, base_p in zip(pad, base_pad):
        if p <= base_p:
            first_padding.append(p)
            other_padding.append([0, 0])
        else:
            first_padding.append(base_p)
            other_padding.append(divmod(p, base_p))

    x = F.pad(x, pad=first_padding, mode='reflect')
    for i, (quotient, remainder) in enumerate(other_padding):
        pad_template = [0, 0, 0, 0]
        for _ in range(quotient):
            pad_template[i] = base_pad[i]
            x = F.pad(x, pad=pad_template, mode='reflect')
        pad_template[i] = remainder
        x = F.pad(x, pad=pad_template, mode='reflect')
    return x


# let's use a indirect method to imitate it
x = torch.arange(12, dtype=torch.float32).reshape(1, 1, 3, 4)
print("F.pad(x, pad=pad, mode='reflect')")
x = infinite_reflect_padding(x, pad=(2, 3, 5, 4))
print(x)

输出:

F.pad(x, pad=pad, mode='reflect')
tensor([[[[ 6.,  5.,  4.,  5.,  6.,  7.,  6.,  5.,  4.],
          [10.,  9.,  8.,  9., 10., 11., 10.,  9.,  8.],
          [ 6.,  5.,  4.,  5.,  6.,  7.,  6.,  5.,  4.],
          [ 2.,  1.,  0.,  1.,  2.,  3.,  2.,  1.,  0.],
          [ 6.,  5.,  4.,  5.,  6.,  7.,  6.,  5.,  4.],
          [10.,  9.,  8.,  9., 10., 11., 10.,  9.,  8.],
          [ 6.,  5.,  4.,  5.,  6.,  7.,  6.,  5.,  4.],
          [ 2.,  1.,  0.,  1.,  2.,  3.,  2.,  1.,  0.],
          [ 6.,  5.,  4.,  5.,  6.,  7.,  6.,  5.,  4.],
          [10.,  9.,  8.,  9., 10., 11., 10.,  9.,  8.],
          [ 6.,  5.,  4.,  5.,  6.,  7.,  6.,  5.,  4.],
          [ 2.,  1.,  0.,  1.,  2.,  3.,  2.,  1.,  0.],
          [ 6.,  5.,  4.,  5.,  6.,  7.,  6.,  5.,  4.],
          [10.,  9.,  8.,  9., 10., 11., 10.,  9.,  8.],
          [ 6.,  5.,  4.,  5.,  6.,  7.,  6.,  5.,  4.],
          [ 2.,  1.,  0.,  1.,  2.,  3.,  2.,  1.,  0.]]]])

AssertionError: Padding value causes wrapping around more than once.

这发生在circular模式中,padding的数量不得超出原始tensor对应维度的大小。文章来源地址https://www.toymoban.com/news/detail-408163.html

import torch
import torch.nn.functional as F

pad = [4, 4, 4, 4]
x = torch.arange(9, dtype=torch.float32).reshape(1, 1, 3, 3)

print("F.pad(x, pad=pad, mode='circular')")
print(F.pad(x, pad=pad, mode='circular'))

"""
F.pad(x, pad=pad, mode='circular')
Traceback (most recent call last):
  File "e:/Coding/PythonTools/TorchPadding/main.py", line 17, in <module>
    print(F.pad(x, pad=pad, mode='circular'))
  File "D:\Programming\Python\envs\pt1102\lib\site-packages\torch\nn\functional.py", line 4193, in _pad
    return _pad_circular(input, pad)
  File "D:\Programming\Python\envs\pt1102\lib\site-packages\torch\nn\functional.py", line 4585, in _pad_circular
    assert padding[-(idx * 2 + 1)] <= size, "Padding value causes wrapping around more than once."
AssertionError: Padding value causes wrapping around more than once.
"""

到了这里,关于PyTorch之F.pad的使用与报错记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PADS VX2.7学习记录03-PADS Logic原理图

    文件——新建 即可 最后保存。 设置——图页 可以在这里添加图页和修改名称。 操作命令: 点击这个命令,出现添加元件的界面 项目:里面不要为空,输入*即可 选择库,然后在选择元件,最后添加就可以了 操作命令: 快捷键:F2 注意:一定要设置对格点50mil或100mil,否则

    2024年02月15日
    浏览(36)
  • PADS VX2.7学习记录04-PADS Layout软件操作

    命令:工具——选项(快捷键Ctrl+Enter) 常规设置: 剩下的默认即可。 操作命令: 设置——显示颜色 1、背景,板框,选择,连接,亮显固定设置 2、显示网络名称,都打钩 3、可以根据自己喜欢的 颜色配置 4、把自己喜欢的颜色配置保存起来,方便下次使用 命令:查看——

    2024年02月08日
    浏览(46)
  • PADS VX2.7学习记录06-PADS Router软件功能操作

    工具——选项 根据自己喜欢的颜色设置即可 PADS Router软件中,走线是F3快捷键 修线是Shift+S 走线时,打孔F4 1、根据BGA的大小,先确定过孔的大小 2、设置规则,安全间距,线宽,过孔 3、操作命令:编辑——特性 4、选择BGA器件,鼠标单击右键,选择扇出即可 链接: BGA扇出介绍

    2024年02月05日
    浏览(42)
  • Flink checkpoint操作流程详解与报错调试方法汇总,增量checkpoint原理及版本更新变化,作业恢复和扩缩容原理与优化

    本文主要参考官方社区给出的checkpoint出错类型和种类,以及查找报错的方法。 主要分为两种 Checkpoint Decline 与 Checkpint Expire 两种类型 下面分开讨论 从业务上来讲,Checkpoint 失败可能有较多的影响。 Flink 恢复时间长,会导致服务可用率降低。 非幂等或非事务场景,导致大量业

    2024年02月22日
    浏览(45)
  • PADS VX2.7学习记录05-PADS Layout设计文件Gerber等输出整理

    一个正常的光绘文件应包括(n+6+2)个文件 n指板层数: 6指: 顶层丝印层:Silkscreen Top 底层丝印层:Silkscreen Bottom 顶层阻焊层:Solder Mask Top 底层阻焊层:Solder Mask Bottom 钻孔参考层:Drill Drawing NC钻孔层:NC Drill 2指:钢网层 顶层助焊层,Paste Mask Top 底层助焊层,Paste Mask Bott

    2024年02月16日
    浏览(45)
  • 【Pytorch报错】RuntimeError:cuDNN error:CUDNN_STATUS_INTERNAL_ERROR 高效理解记录及解决!

    明明跑了一段时间?跑过一次完整的?怎么就出现这个报错呢?代码也未改动?而这就是现实! 观察显卡使用情况,多人共用同一服务器,项目各自运行,会抢占显存,进而报错! 多个项目运行,占用增加,导致内存用完报错,还是很真实的! 文件是否设置了CUDA_VISIBLE_DE

    2024年02月15日
    浏览(47)
  • PADS Layout安全间距检查报错

    在Pads Layout完成layout后,进行工具-验证设计=安全间距检查时,差分对BAK_FIXCLK_100M_P / BAK_FIXCLK_100M_N的安全间距检查报错,最小为3.94mil,但是应该大于等于5mil;如下两张图: 但是检查安全间距设置,导线到导线的最小安全间距设置为了3.4mil,照理说安全间距3.94mil3.4mil,安全间

    2024年02月04日
    浏览(36)
  • 微信小程序解密encryptedData 报错:pad block corrupted 解决方法

    今天碰到一个pad block corrupted错误,跟代码发现是Cipher里面的doFinal()爆出的错。 代码: 错误: 找到微信官方社区,才发现这是微信的一个bug。现在有没有解决不清楚,但是我们自己可以解决。 原因 :wx.login获取session_key,而sessionKey又是解密encryptedData的密钥,所以一旦我们的

    2024年02月12日
    浏览(65)
  • 微信小程序解密encryptedData报错:pad block corrupted 解决方法

    今天碰到一个pad block corrupted错误,跟代码发现是Cipher里面的doFinal()爆出的错。 代码: 错误: 找到微信官方社区,才发现这是微信的一个bug。现在有没有解决不清楚,但是我们自己可以解决。 原因:wx.login获取session_key,而sessionKey又是解密encryptedData的密钥,所以一旦我们的

    2024年02月11日
    浏览(44)
  • Pytorch平均池化nn.AvgPool2d()使用记录

    【pytorch官方文档】 :https://pytorch.org/docs/stable/generated/torch.nn.AvgPool2d.html?highlight=avgpool2d#torch.nn.AvgPool2d 在由多通道组成的输入特征中进行2D平均池化计算 假设输入特征为S,输出特征为D 情况一 ceil_mode=False, count_include_pad=True(计算时包含零填充) 计算过程: 输出形状= floor[(3 - 3

    2023年04月19日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包