从 numpy 到 Pytorch 的矩阵乘法(逐元素)
Matrix multiplication (element-wise) from numpy to Pytorch
我有两个 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 的新手,所以任何帮助将不胜感激。
如果您阅读 transforms.ToTensor()
的文档,您会发现此转换不仅将 numpy 数组转换为 torch.FloatTensor
,而且还将其维度从 H
xW
x3
到 3
xH
xW
.
为此,您需要"undo"
prodasNp = (prodTensor.permute(2, 0, 1) * 255).to(torch.uint8).numpy()
有关详细信息,请参阅 permute
。
我建议您使用 torch.from_numpy
,它可以轻松地将您的 ndarray
转换为 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()
我有两个 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 的新手,所以任何帮助将不胜感激。
如果您阅读 transforms.ToTensor()
的文档,您会发现此转换不仅将 numpy 数组转换为 torch.FloatTensor
,而且还将其维度从 H
xW
x3
到 3
xH
xW
.
为此,您需要"undo"
prodasNp = (prodTensor.permute(2, 0, 1) * 255).to(torch.uint8).numpy()
有关详细信息,请参阅 permute
。
我建议您使用 torch.from_numpy
,它可以轻松地将您的 ndarray
转换为 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()