如何使用 pytorch 的 grid_sample()?

Mr *_*uid 3 pytorch

我在torch.nn.functional按照自己的意愿工作时遇到了一些麻烦,如下例所示:

import torch
import torch.nn.functional as F
import numpy as np

sz = 5
input_arr = torch.from_numpy(np.arange(sz*sz).reshape(1,1,sz,sz)).float()
indices = torch.from_numpy(np.array([-1,-1, -0.5,-0.5, 0,0, 0.5,0.5, 1,1]).reshape(1, 1, 5, 2)).float()

out = F.grid_sample(input_arr, indices)
print(input_arr)
print(out)
Run Code Online (Sandbox Code Playgroud)

由于索引只是输入的对角线,我希望得到类似的结果tensor([[[[0., 6., 12., 18., 24.]]]])(因为 (-1,-1) 应该给出左上角,而 (1,1) 应该给出右下角,根据文档) . 但是,我将其作为输出到控制台:

tensor([[[[ 0.,  1.,  2.,  3.,  4.],
          [ 5.,  6.,  7.,  8.,  9.],
          [10., 11., 12., 13., 14.],
          [15., 16., 17., 18., 19.],
          [20., 21., 22., 23., 24.]]]])
tensor([[[[ 0.0000,  4.5000, 12.0000, 19.5000,  6.0000]]]])
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?非常感谢!

A K*_*eem 8

你有没有试过传递参数align_corners = True?如果您阅读文档,它会指出:

警告

当 时align_corners = True,网格位置取决于相对于输入图像大小的像素大小,因此grid_sample()对于在不同分辨率下(即在上采样或下采样后)给定的相同输入,采样的位置 将有所不同。1.2.0 版之前的默认行为是align_corners = True. 从那时起,默认行为已更改为align_corners = False,以使其与 的默认行为一致interpolate()

为了仔细检查,我运行了带有和不带有 的代码align_corners = True,以获得您需要的正确输出和您描述的错误输出。

# align_corners = False
out = F.grid_sample(input_arr, indices, align_corners = False)
print(out) # tensor([[[[ 0.0000,  4.5000, 12.0000, 19.5000,  6.0000]]]])
Run Code Online (Sandbox Code Playgroud)

# align_corners = True
out = F.grid_sample(input_arr, indices, align_corners = True)
print(out) # tensor([[[[ 0.,  6., 12., 18., 24.]]]])
Run Code Online (Sandbox Code Playgroud)