我正在玩PyTorch,目的是为了学习它,我有一个非常愚蠢的问题:如何将矩阵乘以单个向量?
这是我尝试过的:
>>> import torch
>>> a = torch.rand(4,4)
>>> a
0.3162 0.4434 0.9318 0.8752
0.0129 0.8609 0.6402 0.2396
0.5720 0.7262 0.7443 0.0425
0.4561 0.1725 0.4390 0.8770
[torch.FloatTensor of size 4x4]
>>> b = torch.rand(4)
>>> b
0.1813
0.7090
0.0329
0.7591
[torch.FloatTensor of size 4]
>>> a.mm(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: invalid argument 2: dimension 1 out of range of 1D tensor at /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensor.c:24
>>> a.mm(b.t())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: t() expects a 2D tensor, but self is 1D
>>> b.mm(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: matrices expected, got 1D, 2D tensors at /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensorMath.c:1288
>>> b.t().mm(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: t() expects a 2D tensor, but self is 1D
另一方面,如果我这样做
>>> b = torch.rand(4,2)
然后我的第一次尝试,a.mm(b)
,运行正常。所以问题只是我将一个向量乘以一个矩阵 - 但我怎么能这样做呢?
答案 0 :(得分:16)
您正在寻找
torch.mv(a,b)
请注意,对于将来,您可能还会发现torch.matmul()
有用。 torch.matmul()
推断出参数的维数,因此在向量,矩阵向量或向量矩阵乘法,矩阵乘法或批量矩阵乘法之间执行高阶张量的点积。
答案 1 :(得分:4)
这是补充@mexmex正确且有用的答案的自我答案。
在PyTorch中,与numpy不同,1D Tensors不能与1xN或Nx1张量互换。如果我更换
>>> b = torch.rand(4)
与
>>> b = torch.rand((4,1))
然后我将有一个列向量,与mm
的矩阵乘法将按预期工作。
但这不是必需的,因为@mexmex指出矩阵向量乘法有一个mv
函数,以及一个matmul
函数,它根据维度的大小调度相应的函数。它的输入。