基本概念
torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None, antialias=False)
作用:将输入上采样或降采样到给定的 size 或 scale_factor=
使用的插值算法由 mode 决定,可以选择
-
通用:area, nearest-exact -
3D:nearest, linear(3D-only) -
4D: bilinear, bicubic(4D-only) -
5D:trilinear(5D-only)
目前支持时间,空间和体积采样(输入是 3-D,4-D,5-D)
输入的数据的维度将会被解释为一下形式:
(mini-batch, channels, depth(optional), height(optional), width)
- 在进行上采样的时候,
mini-batch 和channels 是不变化的,变化的只有图的大小,最多是后三个维度
参数
-
input-输入tensor -
size(int/Tuple[int]/Tuple[int, int]/Tuple[int, int, int] )- 输出的维度
-
如果是 int ,则认为后面的维度都变化 a = torch.ones(2, 2, 2, 2)
a = F.interpolate(a, size=3, mode='area')
print(a)
print(a.shape)
>>tensor([[[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]],
[[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]]])
>>torch.Size([2, 2, 3, 3])
-
scale_factor(float/Tuple[float] )- 输出的 size 变成原来的几倍。如果scale_factor 是 tuple,其长度应该和input.dim() 一样(就是去掉前两维之后维度的数目) a = torch.ones(2, 2, 2, 2)
a = F.interpolate(a, scale_factor=(2, 2), mode='bilinear', align_corners=False)
print(a.shape)
>>torch.Size([2, 2, 4, 4])
-
align_corners(bool,optional):几何上,我们认为像素是一个方块而不是一个点。
- True:输入和输出 tensor 将会通过 corner pixels 的中心点来对齐,保留 corner pixels 的值
- Fales:输入和输出 tensors 将会通过 corner pixels 的角点来对齐的
- 默认是 False,只有当
mode = linear, bilinear, bicubic, trilinear 时,才能设置 - 从4×4上采样成8×8。一个是按四角的像素角点对齐,另一个是按四角的像素点中心对齐。
图像来源:https://discuss.pytorch.org/t/what-we-should-use-align-corners-false/22663/9
|