• torch.nn.interpolate—torch上采样和下采样操作


    前言:

    最近博主搭建网络需要用到一些直接对于GPU上的tensor的上采样和下采样操作,如果使用opencv那么就需要先将数据从GPU上面copy到CPU,操作完后在转移到GPU。这样不能利用GPU的加速技术,并且还会导致程序阻塞,pytorch中带有函数interpolate可以实现这个功能,下面详细讲解这个函数的使用。

    1.TORCH.NN.FUNCTIONAL.INTERPOLATE

    torch.nn.functional.interpolate(inputsize=Nonescale_factor=Nonemode='nearest'align_corners=Nonerecompute_scale_factor=Noneantialias=False)[SOURCE]

    **输入尺寸以以下形式解释: 小批量 x 通道 x [可选深度] x [可选高度] x 宽度。

    **向下/向上对给定size 或 给定的输入进行采样scale_factor

    **用于插值的算法由 mode确定目前支持时间、空间和体积采样,即预期输入的形状是 3-D、4-D 或 5-D。

    ***可用于调整大小的模式有(中英文对照)

    nearest, linear (3D-only), bilinear, bicubic (4D-only), trilinear (5D-only), area, nearest-exact

    最近、线性(仅限 3D)、 双线性、双三次(仅限 4D)、三线性(仅限 5D)、面积、最近精确

    2.Parameters

    • input ( Tensor ) – 输入张量

    • size ( int or Tuple int ] or Tuple int , int ] or Tuple int , int , int ] ) – 输出空间尺寸。

    • scale_factor ( floatTuple float ] ) – 空间大小的乘数。如果scale_factor是一个元组,它的长度必须匹配input.dim()。

    • mode ( str ) – 用于上采样的算法: 'nearest''linear''bilinear''bicubic''trilinear''area''nearest-exact'. 默认:'nearest'

    • align_corners ( bool , optional ) – 在几何上,我们将输入和输出的像素视为正方形而不是点。如果设置为True,则输入和输出张量由其角像素的中心点对齐,保留角像素处的值。如果设置为False,则输入和输出张量通过其角像素的角点对齐,并且插值对边界外的值使用边缘值填充,使得此操作在保持相同时与输入大小无关。scale_factor这仅在mode is 'linear'、或'bilinear'时有效。默认:'bicubic''trilinear'False

    • recompute_scale_factor ( bool , optional ) – 重新计算 scale_factor 以用于插值计算。如果recompute_scale_factor是True,则 必须传入 scale_factor 并且scale_factor用于计算输出大小。计算出的输出大小将用于推断插值的新比例。请注意,当scale_factor为浮点数时,由于舍入和精度问题,它可能与重新计算的scale_factor不同。如果recompute_scale_factor是False,那么size或scale_factor将直接用于插值。默认值:None.

    • antialias ( bool , optional ) -- 应用抗锯齿的标志。默认值:False. 使用 anti-alias 选项和align_corners=False,插值结果将匹配 Pillow 结果以进行下采样操作。支持的模式:'bilinear''bicubic'.

    3.Note

    重要note:

    上采样和想采样的参数设置不一致,不要弄混了

    NOTE

    使用mode='bicubic',可能会导致过冲,换句话说,它可以为图像生成负值或大于 255 的值。如果要减少显示图像时的过冲,请显式调用。result.clamp(min=0, max=255)

    NOTE

    Modemode='nearest-exact'匹配 Scikit-Image 和 PIL 最近邻插值算法,并修复了mode='nearest'. 引入此模式是为了保持向后兼容性。模式mode='nearest'匹配有缺陷的 OpenCV 的INTER_NEAREST插值算法。

    NOTE

    当给定 CUDA 设备上的张量时,此操作可能会产生不确定的梯度。有关详细信息,请参阅重现性。

    4.下采样操作

    具体的使用方法:
    1. from functools import partial
    2. class test(nn.Module):
    3. #
    4. def __init__(self,in_ch,out_ch,scale_factor=0.5):
    5. super(test, self).__init__()
    6. #在搭建网络的类里面初始化
    7. self.downsample = partial(F.interpolate,scale_factor=scale_factor, mode='area',recompute_scale_factor=True)
    8. # 注意关键字scale_factor 要与 recompute_scale_factor 搭配使用
    9. def forward(self, x):
    10. x = self.downsample(x)
    11. return x

    recompute_scale_factor=True, 重新计算 scale_factor 以用于插值或下采样计算,

    如果不设置该参数报错误:

    # .../lib/python3.9/site-packages/torch/nn/functional.py:3502:
    # UserWarning: The default behavior for interpolate/upsample with float scale_factor changed in 1.6.0 to align with other frameworks/libraries,and now uses scale_factor directly, instead of relying on the computed output size. If you wish to restore the old behavior,please set recompute_scale_factor=True. See the documentation of nn.Upsample for details.

    5. 插值方法:

    可以设置scale_factor参数,最后输出的尺寸为原始尺寸*该参数,大于1便是插值,小于就是降采样。mode参数是插值算法类型。

  • 相关阅读:
    网络编程实战(二)
    Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(三)
    逻辑卷LVM和交换分区
    stm32flymcu烧写几次后就超时无应答,如何解决?
    从零开始,打造自己的专属游戏世界!
    数据导入与预处理-课程总结-资料汇总贴
    Java - 反射
    静态住宅代理是什么?为什么要选择它?
    软考-流量分析
    Javascript自定义页面复制事件
  • 原文地址:https://blog.csdn.net/weixin_44503976/article/details/126597180