torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)
input (Tensor)
:输入数据size (int or Tuple[int] or Tuple[int, int] or Tuple[int, int, int])
:输出数据的尺寸scale_factor (float or Tuple[float])
:缩放因子mode (str)
:采样算法align_corners (bool, optional)
:几何上,我们认为输入和输出的像素是正方形,而不是点。如果设置为True,则输入和输出张量由其角像素的中心点对齐,从而保留角像素处的值。如果设置为False,则输入和输出张量由它们的角像素的角点对齐,插值使用边界外值的边值填充;当scale_factor保持不变时,使该操作独立于输入大小。仅当使用的算法为’linear’, ‘bilinear’, 'bilinear’or 'trilinear’时可以使用。默认设置为False1. align_corners 参数的实验:
a = [[1., 2.], [4., 5.]]
a = torch.tensor(a).reshape(1, 1, 2, 2)
a: tensor([[[[1., 2.],
[4., 5.]]]])
x = F.interpolate(a, scale_factor=2, mode='bilinear', align_corners=True)
x: tensor([[[[1.0000, 1.3333, 1.6667, 2.0000],
[2.0000, 2.3333, 2.6667, 3.0000],
[3.0000, 3.3333, 3.6667, 4.0000],
[4.0000, 4.3333, 4.6667, 5.0000]]]])
y = F.interpolate(a, scale_factor=2, mode='bilinear', align_corners=False)
y: tensor([[[[1.0000, 1.2500, 1.7500, 2.0000],
[1.7500, 2.0000, 2.5000, 2.7500],
[3.2500, 3.5000, 4.0000, 4.2500],
[4.0000, 4.2500, 4.7500, 5.0000]]]])
z = F.interpolate(a, size=(4, 4), mode='bilinear', align_corners=False)
z: tensor([[[[1.0000, 1.2500, 1.7500, 2.0000],
[1.7500, 2.0000, 2.5000, 2.7500],
[3.2500, 3.5000, 4.0000, 4.2500],
[4.0000, 4.2500, 4.7500, 5.0000]]]])
2. scale_factor 参数的实验(缩小)
(5, 4) --> (2, 2)
b = [[1., 2., 3., 4.]] * 5
b = torch.tensor(b).reshape(1, 1, 5, 4)
b: tensor([[[[1., 2., 3., 4.],
[1., 2., 3., 4.],
[1., 2., 3., 4.],
[1., 2., 3., 4.],
[1., 2., 3., 4.]]]])
# (5, 4) -> (2, 2) 缩小因子为(0.4, 0.5)
b1 = F.interpolate(b, scale_factor=(0.4, 0.5), mode='bilinear', align_corners=True)
b1: tensor([[[[1., 4.],
[1., 4.]]]])
b2 = F.interpolate(b, scale_factor=0.4, mode='bilinear', align_corners=True)
b2: tensor([[[[1.],
[1.]]]])
b3 = F.interpolate(b, scale_factor=0.5, mode='bilinear', align_corners=True)
b3: tensor([[[[1., 4.],
[1., 4.]]]])
b4 = F.interpolate(b, size=(2, 2), mode='bilinear', align_corners=True)
b4: tensor([[[[1., 4.],
[1., 4.]]]])