【问题标题】:Matrix multiplication (element-wise) from numpy to Pytorch从 numpy 到 Pytorch 的矩阵乘法(逐元素)
【发布时间】:2019-10-13 23:33:12
【问题描述】:

我有两个 numpy 数组(图像和环境图),

MatA
MatB

两者都有形状(256, 512, 3)

当我用 numpy 进行乘法(逐元素)时:

prod = np.multiply(MatA,MatB)

我得到了想要的结果(返回图像时通过 Pillow 进行可视化)

但是当我使用 pytorch 完成时,我得到了一个非常奇怪的结果(甚至不接近上述)。

我用下面的代码做到了:

MatATensor = transforms.ToTensor()(MatA)
MatBTensor = transforms.ToTensor()(MatB)

prodTensor = MatATensor * MatBTensor

由于某些原因,MatATensor 和 MatBtensor 的形状都是

torch.Size([3, 256, 512])

prodTensor 也是如此。 当我尝试重塑为(256,512,3) 时,出现错误。

有没有办法获得相同的结果?

我是 pytorch 的新手,因此我们将不胜感激。

【问题讨论】:

    标签: python pytorch matrix-multiplication


    【解决方案1】:

    我建议您使用torch.from_numpy,它可以轻松地将您的ndarrays 转换为torch 张量。如:

    In[1]: MatA = np.random.rand(256, 512, 3)
    In[2]: MatB = np.random.rand(256, 512, 3)
    
    In[3]: MatA_torch = torch.from_numpy(MatA)
    In[4]: MatB_torch = torch.from_numpy(MatB)
    
    In[5]: mul_np = np.multiply(MatA, MatB)
    In[6]: mul_torch = MatA_torch * MatB_torch
    
    In[7]: torch.equal(torch.from_numpy(mul_np), mul_torch)
    Out[7]: True
    
    In[8]: mul_torch.shape
    Out[8]: torch.Size([256, 512, 3])
    

    如果你想让它回到 numpy,就这样做:

    mul_torch.numpy()
    

    【讨论】:

      【解决方案2】:

      如果您阅读transforms.ToTensor() 的文档,您会看到这种转换不仅将numpy 数组转换为torch.FloatTensor,而且还将其维度从HxWx3 转换为@987654329 @xHxW.
      要“撤消”此操作,您需要

       prodasNp = (prodTensor.permute(2, 0, 1) * 255).to(torch.uint8).numpy()
      

      更多信息请参见permute

      【讨论】:

      • 谢谢@Shai 的回答。我终于设法通过在 2d (w*h,3) 中重塑矩阵来解决它。我会尽快确认您的解决方案
      • @alphjheon 请注意,permuteview 之间存在根本区别:而view 会改变张量的形状不会 影响元素的实际排列。相反,permute 对张量的元素重新排序。有关详细信息,请参阅this answer
      猜你喜欢
      • 2014-11-13
      • 2019-11-23
      • 2016-06-04
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多