【Python/torch】torch.nn.functional.interpolate()函数解析

【Python/torch】torch.nn.functional.interpolate()函数详解

1. 介绍

nn.functional.interpolate 是 PyTorch 中的一个函数,用于对输入的张量进行插值操作。它可以用来缩放、放大或者重新定义张量的空间尺寸。

2. API

import torch
out = 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被他们的周围像素所环绕。
  • 输出:
    • out:输出的tensor

3. 例子

3.1 one

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.]]]])
'''

3.2 two

除了将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.]]]])
'''

3.3 three

上面例子,默认的插值为nearest插值,接下来我们看一个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)
'''

3.4 four

看到双线性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]]]])
'''

3.5 five

上面两个例子中,

  • 如果设置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的区域,区域的边界是对齐的,他们的中心不对齐。

4. 总结

通常可以使用pytorch中的torch.nn.functional.interpolate()实现插值和上采样。上采样,在深度学习框架中,可以简单理解为任何可以让你的图像变成更高分辨率的技术。

5. 参考

【1】https://blog.csdn.net/weixin_41978699/article/details/126862177

猜你喜欢

转载自blog.csdn.net/qq_51392112/article/details/129690098