从 numpy 到 Pytorch 的矩阵乘法(元素)

Matrix multiplication (element-wise) from numpy to Pytorch

提问人:singa1994 提问时间:5/28/2019 最后编辑:Anubhav Singhsinga1994 更新时间:5/29/2019 访问量:2190

问:

我有两个numpy数组(image和environment map),

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 矩阵乘法

评论


答:

1赞 Shai 5/28/2019 #1

如果您阅读了转换的文档。ToTensor(),你会看到这个转换不仅将 numpy 数组转换为 ,而且还将其维度从 xx 转置为 xx。
要“撤消”此操作,您需要
torch.FloatTensorHW33HW

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

有关更多信息,请参见 permute

评论

0赞 singa1994 5/28/2019
谢谢@Shai的回答。我最终设法通过重塑 2d 矩阵 (w*h,3) 来解决这个问题。我会尽快确认您的解决方案
0赞 Shai 5/28/2019
@alphjheon注意的是,和之间有一个根本的区别:虽然改变了张量的形状,但并不影响元素的实际排列。相反,对张量的元素进行重新排序。有关更多详细信息,请参阅此答案permuteviewviewpermute
1赞 ndrwnaguib 5/29/2019 #2

我建议你使用 torch.from_numpy,它可以轻松地将你的 s 转换为火炬张量。如:ndarray

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()