web-dev-qa-db-fra.com

Comment multiplier une matrice par un vecteur dans PyTorch

Je joue avec PyTorch dans le but de l'apprendre, et j'ai une question très stupide: comment puis-je multiplier une matrice par un seul vecteur?

Voici ce que j'ai essayé:

>>> 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

D'un autre côté, si je le fais

>>> b = torch.Rand(4,2)

alors ma première tentative, a.mm(b), fonctionne très bien. Le problème est donc simplement que je multiplie un vecteur plutôt qu'une matrice --- mais comment faire?

8
Nathaniel

Vous cherchez

torch.mv(a,b)

Notez que pour l'avenir, vous pouvez également trouver torch.matmul() utile. torch.matmul() déduit la dimensionnalité de vos arguments et effectue en conséquence soit des produits scalaires entre vecteurs, une multiplication matrice-vecteur ou matrice-vecteur, une multiplication matricielle ou une multiplication matricielle par lots pour des tenseurs d'ordre supérieur.

17
mexmex

Ceci est une auto-réponse pour compléter la réponse correcte et utile de @ mexmex.

Dans PyTorch, contrairement à numpy, les tenseurs 1D ne sont pas interchangeables avec les tenseurs 1xN ou Nx1. Si je remplace

>>> b = torch.Rand(4)

avec

>>> b = torch.Rand((4,1))

alors j'aurai un vecteur de colonne, et la multiplication de matrice avec mm fonctionnera comme prévu.

Mais ce n'est pas nécessaire, car comme le souligne @mexmex, il existe une fonction mv pour la multiplication matrice-vecteur, ainsi qu'une fonction matmul qui distribue la fonction appropriée en fonction des dimensions de son contribution.

5
Nathaniel