pytorch - 如何使用 pytorch 的 grid_sample()?
问题描述
我在按自己的意愿工作时遇到了一些麻烦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)
由于索引只是输入的对角线,我希望得到类似的东西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]]]])
我究竟做错了什么?非常感谢!
解决方案
你试过传递论点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]]]])
和
# align_corners = True
out = F.grid_sample(input_arr, indices, align_corners = True)
print(out) # tensor([[[[ 0., 6., 12., 18., 24.]]]])
推荐阅读
- javascript - 如何修改 react-redux 连接函数的默认名称?
- php - Symfony,proopgh,事件溯源错误 42S02。也许没有设置事件流表?
- javascript - 使用 Javascript 循环播放音频
- excel - csv 回车不显示在 Excel 中
- javascript - 如何使用 Redux 更新对象数组中的状态?
- c# - 用于获取 LINQ 的表达式,用于 SQL IN() 的包含到 EF,其中实体子属性等于值
- php - .htaccess - 不对 API 调用应用重写规则
- node.js - Discord Bot (node.js):从外部文件读取数据
- c - 在c中获取数组/向量的大小
- sql-server - 通过 Linux + ODBC + Active Directory 身份验证连接到 Azure SQL Server