【问题标题】:pytorch compute pairwise difference: Incorrect result in NumPy vs PyTorch and different PyTorch versionspytorch 计算成对差异:NumPy 与 PyTorch 和不同 PyTorch 版本的结果不正确
【发布时间】:2019-09-16 22:52:13
【问题描述】:

假设我有两个数组,并且我想计算两个相同形状矩阵的每两行之间的逐行差异,如下所示。这就是程序在 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])。 (P.S. 我也尝试过从 pytorch 中解压,但它不起作用)。

【问题讨论】:

    标签: python numpy pytorch tensor numpy-ndarray


    【解决方案1】:

    问题是由于使用 PyTorch 0.1 而出现的。如果使用 PyTorch 1.0.1,NumPy 的相同操作可以推广到 PyTorch,无需任何修改和问题。这是在 Colab 中运行的快照。

    如我们所见,我们确实得到了相同的结果。


    这里尝试重现您遇到的错误结果:

    >>> 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)堆叠行来组合在一起,在每一行是二维之后会给我们形状(2, 2, 3)

    现在,尝试在0.1版本中执行以上两个步骤,它会抛出错误:

    RuntimeError:/opt/conda/conda-bld/pytorch_1501971235237/work/pytorch-0.1.12/torch/lib/TH/generic/THTensorMath.c:831 处的张量大小不一致

    【讨论】:

    • 嘿 - 你比我坐得更多,但为什么要image
    • @modesitt 我通常不这样做,但我的机器上没有安装 PyTorch。此外,它的代码与 OP 完全相同。所以,我想在这种情况下没有问题:)
    • @PalashAhuja 确实是这样。请查看更新的答案!
    • 我认为这应该也是以前版本中实现的功能。没关系,我已经更新了 pytorch,它似乎正在工作。非常感谢。
    • @PalashAhuja 我添加了有关此的更多信息!
    【解决方案2】:

    我使用最新版本的 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])
    """
    

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2020-06-08
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      相关资源
      最近更新 更多