82

在 numpy 中,我可以像这样进行简单的矩阵乘法:

a = numpy.arange(2*3).reshape(3,2)
b = numpy.arange(2).reshape(2,1)
print(a)
print(b)
print(a.dot(b))

但是,当我尝试使用 PyTorch 张量时,这不起作用:

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 处的张量大小不一致

任何想法如何在 PyTorch 中进行矩阵乘法?

4

4 回答 4

114

您正在寻找

torch.mm(a,b)

请注意,它的torch.dot()行为与np.dot(). 有一些关于这里需要什么的讨论。具体来说,torch.dot()a和都b视为一维向量(不管它们的原始形状)并计算它们的内积。抛出错误,因为这种行为使您a成为长度为 6b的向量和长度为 2 的向量;因此无法计算它们的内积。对于 PyTorch 中的矩阵乘法,请使用torch.mm(). 相比之下, Numpynp.dot()更灵活;它计算一维数组的内积并为二维数组执行矩阵乘法。

根据普遍的需求,如果两个参数都是 ,则该函数torch.matmul执行矩阵乘法,如果两个参数都是2D,则计算它们的点积1D。对于此类维度的输入,其行为与 相同np.dot。它还允许您批量进行广播或matrix x matrixmatrix x vectorvector x vector操作。有关更多信息,请参阅其文档

# 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])
于 2017-06-13T15:25:39.183 回答
47

如果要进行矩阵(2 阶张量)乘法,可以通过四种等效方式进行:

AB = A.mm(B) # computes A.B (matrix multiplication)
# or
AB = torch.mm(A, B)
# or
AB = torch.matmul(A, B)
# or, even simpler
AB = A @ B # Python 3.5+

有一些微妙之处。来自PyTorch 文档

torch.mm 不广播。对于广播矩阵产品,请参阅 torch.matmul()。

例如,您不能将两个一维向量与torch.mm相乘,也不能将批处理矩阵相乘(等级 3)。为此,您应该使用更通用的torch.matmul. 有关 的广播行为的详细列表torch.matmul,请参阅文档

对于逐元素乘法,您可以简单地执行(如果 A 和 B 具有相同的形状)

A * B # element-wise matrix multiplication (Hadamard product)
于 2017-06-13T16:57:54.863 回答
8

使用torch.mm(a, b)torch.matmul(a, b)
两者相同。

>>> torch.mm
<built-in method mm of type object at 0x11712a870>
>>> torch.matmul
<built-in method matmul of type object at 0x11712a870>

还有一个可能很高兴知道的选择。那就是@运营商。@西蒙H。

>>> a = torch.randn(2, 3)
>>> b = torch.randn(3, 4)
>>> a@b
tensor([[ 0.6176, -0.6743,  0.5989, -0.1390],
        [ 0.8699, -0.3445,  1.4122, -0.5826]])
>>> a.mm(b)
tensor([[ 0.6176, -0.6743,  0.5989, -0.1390],
        [ 0.8699, -0.3445,  1.4122, -0.5826]])
>>> a.matmul(b)
tensor([[ 0.6176, -0.6743,  0.5989, -0.1390],
        [ 0.8699, -0.3445,  1.4122, -0.5826]])    

三者给出相同的结果。

相关链接:
矩阵乘法运算符
PEP 465 -- 矩阵乘法的专用中缀运算符

于 2018-10-29T14:43:37.943 回答
7

您可以使用“@”来计算 pytorch 中两个张量之间的点积。

a = torch.tensor([[1,2],
                  [3,4]])
b = torch.tensor([[5,6],
                  [7,8]])
c = a@b #For dot product
c

d = a*b #For elementwise multiplication 
d
于 2020-07-20T13:40:10.720 回答