• nn.functional.interpolate


    torch.nn.functional.interpolate

    官方文档: interpolate

    Down/up samples the input to either the given size or the given scale_factor

    作用: 给定一个feature,将其插值为给定的size大小,或者根据scale factor参数进行缩放

    torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None, antialias=False)

    • input: 输入tensor
    • size: 输出的尺寸大小,例如: (240, 240),将一个输入尺寸变为240
    • scale_factor: 尺寸缩放因子,例如: 2, 将输入变为原来的2倍
    • mode: 插值方法,一般为nearest或者bilinear
    • align_corners: 如果设置为True的话,输入和输出的tensor被他们的周围像素所环绕,这里给出pytorch论坛对此参数进行的讨论,之后也会给出例子说明

    nearest插值例子

    a = torch.tensor([[1.,2.],[3.,4.]])
    a = torch.unsqueeze(a, dim=0)
    a = torch.unsqueeze(a, dim=0)
    b = nn.functional.interpolate(a, size=(4, 4))
    
    '''
    a
    tensor([[[[1., 2.],
              [3., 4.]]]])
    torch.Size([1, 1, 2, 2])
    
    b
    tensor([[[[1., 1., 2., 2.],
              [1., 1., 2., 2.],
              [3., 3., 4., 4.],
              [3., 3., 4., 4.]]]])
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    除了将size=(4,4)外,原来size为2,这里将scale_factor设为2,也可以实现上述效果

    b = nn.functional.interpolate(a, scale_factor=2)
    
    '''
    b
    tensor([[[[1., 1., 2., 2.],
              [1., 1., 2., 2.],
              [3., 3., 4., 4.],
              [3., 3., 4., 4.]]]])
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    上面例子,默认的插值为nearest插值,接下来我们看一个bilinear插值的例子

    bilinear插值例子

    b = nn.functional.interpolate(a, size=(4, 4), mode="bilinear")
    
    '''
    b
    tensor([[[[1.0000, 1.2500, 1.7500, 2.0000],
              [1.5000, 1.7500, 2.2500, 2.5000],
              [2.5000, 2.7500, 3.2500, 3.5000],
              [3.0000, 3.2500, 3.7500, 4.0000]]]])
    /Users/harry/miniconda3/envs/torch/lib/python3.7/site-packages/torch/nn/functional.
    py:3455: UserWarning: Default upsampling behavior when mode=bilinear is changed to
    align_corners=False since 0.4.0. Please specify align_corners=True if the old behavior
    is desired. See the documentation of nn.Upsample for details.
      "See the documentation of nn.Upsample for details.".format(mode)
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    看到双线性bilinear插值的结果和nearest结果不同,这里还报了错,大体意思是说在双线性插值的情况下,如果设置align_corners=True,输出可能取决于输入大小,并且不会按照比例将输出和输入像素进行对齐,因此默认的将align_corners=False,可以参考这两个文档: upsample, interpolate

    下面给出align_corners=True的例子

    b = nn.functional.interpolate(a, size=(4, 4), mode="bilinear", align_corners=True)
    
    '''
    b
    tensor([[[[1.0000, 1.3333, 1.6667, 2.0000],
              [1.6667, 2.0000, 2.3333, 2.6667],
              [2.3333, 2.6667, 3.0000, 3.3333],
              [3.0000, 3.3333, 3.6667, 4.0000]]]])
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    观察上面两个例子,如果设置align_corners=False,也就是默认设置,1,2,3,4最后会到四个角落,还是比较规则的比例,但是如果设置align_corners=True,1,2,3,4不会按照比例,位置会发生变化变得不规则,但是此时的1,2,3,4四周均被元素环绕,并且算上环绕部分,他们是对齐的,即(1, 1.3333, 1.6667, 2.000), (1.6667, 2.0000, 2.3333, 2.6667), (2.3333, 2.6667, 3.0000, 3.3333), (3.0000, 3.3333, 3.6667, 4.0000)这四部分分别看做一个整体,他们是对齐的,下面介绍下align_corners参数的运作

    在这里插入图片描述

    图来自pytorch论坛,此参数主要解释为原来的输入是否会被插值元素环绕

    • 当True的时候,像素被视为网格点上,网格点是对齐的
    • 当False的时候,像素被视为一个 1 × 1 1\times 1 1×1的区域,区域的边界是对齐的,他们的中心不对齐
  • 相关阅读:
    线程安全的随机数
    基于Spring、SpringMVC、Mybatis的超市管理系统
    爬虫 — Scrapy 框架(一)
    [附源码]Python计算机毕业设计Django企业售后服务管理系统
    【m98】视频帧的 jitterbuffer 1:
    JVM:垃圾收集器与内存分配策略(2)
    java基础面试
    10年测试经验分享:新手如何找到适合自己的软件测试项目?
    HTML中marquee标签的属性之多少?
    「Python入门」python环境搭建及VScode使用python运行方式
  • 原文地址:https://blog.csdn.net/weixin_41978699/article/details/126862177