如何在 PyTorch 中进行矩阵乘积
How to do product of matrices in 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))
但是,当我尝试使用 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: inconsistent tensor size at
/Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensorMath.c:503
知道如何在 PyTorch 中进行矩阵乘法吗?
您正在寻找
torch.mm(a,b)
请注意 torch.dot()
的行为与 np.dot()
不同。有一些关于什么是可取的 here 的讨论。具体来说,torch.dot()
将 a
和 b
都视为一维向量(不管它们的原始形状如何)并计算它们的内积。抛出错误,因为此行为使您的 a
成为长度为 6 的向量,而您的 b
成为长度为 2 的向量;因此无法计算它们的内积。对于 PyTorch 中的矩阵乘法,使用 torch.mm()
。相比之下Numpy的np.dot()
更加灵活;它计算一维数组的内积并为二维数组执行矩阵乘法。
根据大众需求,如果两个参数都是 2D
,函数 torch.matmul
执行矩阵乘法,如果两个参数都是 1D
,则计算它们的点积。对于此类维度的输入,其行为与 np.dot
相同。它还允许您批量进行广播或 matrix x matrix
、matrix x vector
和 vector x vector
操作。有关详细信息,请参阅其 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])
如果你想做一个矩阵(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 documentation:
torch.mm does not broadcast. For broadcasting matrix products,
see torch.matmul().
例如,您不能将两个一维向量与 torch.mm
相乘,也不能将批处理矩阵(秩 3)相乘。为此,你应该使用更通用的torch.matmul
。有关 torch.matmul
广播行为的详尽列表,请参阅 documentation。
对于逐元素乘法,你可以简单地做(如果 A 和 B 具有相同的形状)
A * B # element-wise matrix multiplication (Hadamard product)
使用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>
还有一个选项可能值得了解。
即 @
运算符。 @Simon 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]])
三者给出相同的结果。
相关链接:
Matrix multiplication operator
PEP 465 -- A dedicated infix operator for matrix multiplication
您可以使用“@”在 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
在 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: inconsistent tensor size at /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensorMath.c:503
知道如何在 PyTorch 中进行矩阵乘法吗?
您正在寻找
torch.mm(a,b)
请注意 torch.dot()
的行为与 np.dot()
不同。有一些关于什么是可取的 here 的讨论。具体来说,torch.dot()
将 a
和 b
都视为一维向量(不管它们的原始形状如何)并计算它们的内积。抛出错误,因为此行为使您的 a
成为长度为 6 的向量,而您的 b
成为长度为 2 的向量;因此无法计算它们的内积。对于 PyTorch 中的矩阵乘法,使用 torch.mm()
。相比之下Numpy的np.dot()
更加灵活;它计算一维数组的内积并为二维数组执行矩阵乘法。
根据大众需求,如果两个参数都是 2D
,函数 torch.matmul
执行矩阵乘法,如果两个参数都是 1D
,则计算它们的点积。对于此类维度的输入,其行为与 np.dot
相同。它还允许您批量进行广播或 matrix x matrix
、matrix x vector
和 vector x vector
操作。有关详细信息,请参阅其 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])
如果你想做一个矩阵(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 documentation:
torch.mm does not broadcast. For broadcasting matrix products, see torch.matmul().
例如,您不能将两个一维向量与 torch.mm
相乘,也不能将批处理矩阵(秩 3)相乘。为此,你应该使用更通用的torch.matmul
。有关 torch.matmul
广播行为的详尽列表,请参阅 documentation。
对于逐元素乘法,你可以简单地做(如果 A 和 B 具有相同的形状)
A * B # element-wise matrix multiplication (Hadamard product)
使用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>
还有一个选项可能值得了解。
即 @
运算符。 @Simon 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]])
三者给出相同的结果。
相关链接:
Matrix multiplication operator
PEP 465 -- A dedicated infix operator for matrix multiplication
您可以使用“@”在 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