Pytorch вычисляет попарную разницу: неверный результат в NumPy против PyTorch и разных версиях PyTorch - PullRequest
1 голос
/ 27 апреля 2019

Предположим, у меня есть два массива, и я хочу вычислить построчную разницу между каждыми двумя рядами двух матриц одинаковой формы следующим образом. Вот так выглядит процедура в numpy, и я хочу повторить то же самое в pytorch.

>>> a = np.array([[1,2,3],[4,5,6]])
>>> b = np.array([[3,4,5],[5,3,2]])
>>> c = a[np.newaxis,:,:] - b[:,np.newaxis,:]
>>> print(c)
[[[-2 -2 -2]
  [ 1  1  1]]

 [[-4 -1  1]
  [-1  2  4]]]

Кстати, я пытался сделать то же самое, используя pytorch, но он не работает. Есть ли в любом случае мы могли бы сделать то же самое в pytorch

>>> import torch
>>> a = torch.from_numpy(a)
>>> b = torch.from_numpy(b)
>>> c1 = a[None,:,:]
>>> c2 = b[:,None,:]
>>> diff = c1 - c2
>>> print(diff.size())
torch.Size([1, 2, 3])

Я действительно искал torch.Size([2,2,3]). (П.С. я также пытался отжать из pytorch, но это не работает).

Ответы [ 2 ]

3 голосов
/ 27 апреля 2019

Проблема возникает из-за использования PyTorch 0.1 . При использовании PyTorch 1.0.1 та же операция NumPy обобщается на PyTorch без каких-либо изменений и проблем. Вот снимок пробега в Колабе.

enter image description here

Как мы видим, мы действительно получаем те же результаты.


Вот попытка воспроизвести ошибку, с которой вы столкнулись при получении неверного результата:

>>> t1 = torch.from_numpy(a)
>>> t2 = torch.from_numpy(b)
>>> t1[np.newaxis, ...] - t2[:, np.newaxis, ...]

(0 ,.,.) = 
 -2 -2 -2
 -1  2  4
[torch.LongTensor of size 1x2x3]

>>> torch.__version__
'0.1.12_1'

Итак, пожалуйста, обновите вашу версию PyTorch до 1.0.1 !


Подробнее о деталях:

Основная причина, по которой он не работал в PyTorch версии 0.1 , заключается в том, что вещание тогда не было полностью реализовано. По сути, повышение тензора до 3D с последующим вычитанием может быть выполнено в два этапа, как в (в версии 1.0.1 ):

>>> t1[:1, ] - t2
>>> tensor([[-2, -2, -2],   # t1_r1
            [-4, -1,  1]])  # t1_r2

>>> t1[1:, ] - t2
>>> tensor([[ 1,  1,  1],   # t2_r1
            [-1,  2,  4]])  # t2_r2

Результаты вышеупомянутых двух операций, скомпонованных путем наложения строк в порядке (t1_r1, t2_r1, t1_r2, t2_r2), после того, как каждая из строк, являющаяся 2D, даст нам форму (2, 2, 3).

Теперь попробуйте выполнить вышеупомянутые два шага в версии 0.1, она выдаст ошибку:

RuntimeError: несоответствующий размер тензора в /opt/conda/conda-bld/pytorch_1501971235237/work/pytorch-0.1.12/torch/lib/TH/generic/THTensorMath.c:831

1 голос
/ 27 апреля 2019

Я использую последнюю версию Pytorch 1.0.1.Это решение работает для меня:


a = torch.tensor([[1,2,3],[4,5,6]])
b = torch.tensor([[3,4,5],[5,3,2]])
c = a.view(1, 2, 3) - b.view(2, 1, 3)
"""
tensor([[[-2, -2, -2],
         [ 1,  1,  1]],

        [[-4, -1,  1],
         [-1,  2,  4]]])
"""
c.size()
"""
torch.Size([2, 2, 3])
"""
...