如何在PyTorch中做矩阵乘积 [英] How to do product of matrices in PyTorch
问题描述
在numpy中,我可以像这样做一个简单的矩阵乘法:
In numpy I can do a simple matrix multiplication like this:
a = numpy.arange(2*3).reshape(3,2)
b = numpy.arange(2).reshape(2,1)
print(a)
print(b)
print(a.dot(b))
但是,当我使用PyTorch Tensors尝试此操作时,这不起作用:
However, when I am trying this with PyTorch Tensors, this does not work:
a = torch.Tensor([[1, 2, 3], [1, 2, 3]]).view(-1, 2)
b = torch.Tensor([[2, 1]]).view(2, -1)
print(a)
print(a.size())
print(b)
print(b.size())
print(torch.dot(a, b))
此代码引发以下错误:
RuntimeError:张量大小不一致 /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensorMath.c:503
RuntimeError: inconsistent tensor size at /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensorMath.c:503
有什么想法可以在PyTorch中进行矩阵乘法吗?
Any ideas how matrix multiplication can be conducted in PyTorch?
推荐答案
您正在寻找
torch.mm(a,b)
请注意,torch.dot()
的行为与np.dot()
不同.在此处进行了一些讨论.具体来说,torch.dot()
将a
和b
都视为一维向量(与它们的原始形状无关),并计算其内积.引发错误,因为此行为使a
为长度6的向量,而b
为长度2的向量;因此无法计算其内积.对于PyTorch中的矩阵乘法,请使用torch.mm()
.相反,Numpy的np.dot()
更为灵活.它计算1D数组的内积,并为2D数组执行矩阵乘法.
Note that torch.dot()
behaves differently to np.dot()
. There's been some discussion about what would be desirable here. Specifically, torch.dot()
treats both a
and b
as 1D vectors (irrespective of their original shape) and computes their inner product. The error is thrown, because this behaviour makes your a
a vector of length 6 and your b
a vector of length 2; hence their inner product can't be computed. For matrix multiplication in PyTorch, use torch.mm()
. Numpy's np.dot()
in contrast is more flexible; it computes the inner product for 1D arrays and performs matrix multiplication for 2D arrays.
根据流行的需求,如果两个参数均为2D
,则函数torch.matmul
执行矩阵乘法,如果两个参数均为1D
,则计算其点积.对于此类尺寸的输入,其行为与np.dot
相同.它还允许您分批进行广播或matrix x matrix
,matrix x vector
和vector x vector
操作.有关更多信息,请参见其文档.
By popular demand, the function torch.matmul
performs matrix multiplications if both arguments are 2D
and computes their dot product if both arguments are 1D
. For inputs of such dimensions, its behaviour is the same as np.dot
. It also lets you do broadcasting or matrix x matrix
, matrix x vector
and vector x vector
operations in batches. For more info, see its docs.
# 1D inputs, same as torch.dot
a = torch.rand(n)
b = torch.rand(n)
torch.matmul(a, b) # torch.Size([])
# 2D inputs, same as torch.mm
a = torch.rand(m, k)
b = torch.rand(k, j)
torch.matmul(a, b) # torch.Size([m, j])
这篇关于如何在PyTorch中做矩阵乘积的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!