【问题标题】:understanding the torch.nn.functional.grid_sample op by concrete example通过具体示例了解 torch.nn.functional.grid_sample 操作
【发布时间】:2022-08-17 11:00:48
【问题描述】:

我正在调试一个内部有一个 torch.nn.functional.grid.sample 运算符的神经网络。使用 Pycharm IDE,我可以在调试期间观察值。我的网格是1*15*2张量,这里是第一批中的值。

我的输入是一个1*128*16*16张量,这里是第一批第一个通道中的值:

我的输出是1*128*1*15张量,这里是第一批的第一个通道中的值。

align_corners = False,mode = \'bilinear\',padding_mode = \'zero\'。

对于网格坐标 (-1,-1),我可以理解值 (-4.74179) 是从左上角的 4 个值中采样的,其中 3 个是填充的 \'0\',其中 1 个是值 \'-18.96716\'.(-18.96716/4 = -4.74179)。

但是对于其他网格坐标,我很困惑。以值\'84.65594\'为例,其对应的网格坐标为(-0.45302, 0.53659)。我首先将它们从 (-1,1) 转换为 (0,15),方法是加 1,然后除以 2,然后乘以 15(参见 official implementation)。转换后的坐标是 (4.10235, 11.524425),我看到应该从中采样的四个值是:

(x)44.20010---0.10235---------(y)26.68777
|             |                    |
|             |                    |
0.524425---(a,b)--------------------
|             |                    |
|             |                    |
(w)102.18765---------------------(z)30.03996

这是我的手动计算,让:

a = 0.10235
b = 0.524425
x = 44.20010
y = 26.68777
z = 30.03996
w = 102.18765

插值应为:

output = a*b*z + (1 - a)*(1 - b)*x + (1 - a)*b*w + (1-b)*a*y
       = 0.10235*0.524425*30.03996 + (1-0.10235)*(1-0.524425)*44.20010 + (1- 
         0.10235)*0.524425*102.18765 + (1-0.524425)*0.10235*26.68777
       = 69.8852865171

这不是84.65594,我无法弄清楚输出中的值“84.65594”是如何计算的,请帮忙!

    标签: pytorch bilinear-interpolation


    【解决方案1】:

    我回答了我自己的问题,结果发现不一致是由于“align_corners”标志造成的。我的计算方式实际上是在程序中'align_corners'为真的情况下,该标志设置为假。样本坐标计算方法见this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 2017-03-10
      • 2019-08-16
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      相关资源
      最近更新 更多