Как использовать grid_sample () Pytorch? - PullRequest
0 голосов
/ 03 мая 2020

У меня возникли проблемы с тем, чтобы 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]]]])

Что я делаю не так? Большое спасибо!

1 Ответ

2 голосов
/ 03 мая 2020

Вы пытались передать аргумент 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.]]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...