如何在PyTorch中做矩阵的乘积

blc*_*ird 40 python matrix pytorch

在numpy中我可以做一个简单的矩阵乘法,如下所示:

a = numpy.arange(2*3).reshape(3,2)
b = numpy.arange(2).reshape(2,1)
print(a)
print(b)
print(a.dot(b))
Run Code Online (Sandbox Code Playgroud)

但是,当我使用PyTorch Tensors进行此操作时,这不起作用:

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))
Run Code Online (Sandbox Code Playgroud)

此代码抛出以下错误:

RuntimeError:/Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensorMath.c:503中的张量大小不一致

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

mex*_*mex 59

您正在寻找

torch.mm(a,b)
Run Code Online (Sandbox Code Playgroud)

请注意,torch.dot()行为与...不同np.dot().还有的是什么希望了一些讨论在这里.具体而言,torch.dot()把都ab一维向量(其原来的形状,而不管),并计算它们的内积.抛出错误,因为此行为使您a的长度为6 b的向量和长度为2的向量; 因此他们的内在产品无法计算.对于PyTorch中的矩阵乘法,请使用torch.mm().np.dot()相比之下,Numpy 更灵活; 它计算1D阵列的内积并对2D阵列执行矩阵乘法.

  • 由于这是公认的答案,我认为您应该包括torch.matmul。它对一维数组执行点积运算,对二维数组执行矩阵乘法。 (2认同)

BiB*_*iBi 29

在mexmex答案的基础上,如果你想进行矩阵乘法,你可以用三种方式做到:

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+
Run Code Online (Sandbox Code Playgroud)

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

A * B # element-wise matrix multiplication (Hadamard product)
Run Code Online (Sandbox Code Playgroud)

  • `torch.matmul` 和 `@` 仅对于 2 阶张量是等效的。`@` 操作“实际上”是 `torch.bmm` (*b*atch *m*atrix *m*ultiply),其中矩阵乘法是在最后两个维度上完成的 (https://discuss.pytorch.org /t/此实例中的标志如何工作/11232)。 (3认同)
  • 我*爱*一个字符的@@运算符。w @ x将成为我的目标 (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)


Dav*_*ung 5

用途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>
Run Code Online (Sandbox Code Playgroud)

还有另一种可能很了解的选项。那是@操作员。@西蒙·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]])    
Run Code Online (Sandbox Code Playgroud)

这三个给出相同的结果。

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