2017-06-13 1 views
6

En numpy je peux faire une simple multiplication matricielle comme ceci:Comment faire produit scalaire des matrices dans PyTorch

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

Cependant, quand je suis en train cela avec PyTorch tenseurs, cela ne fonctionne pas:

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

Ce code génère l'erreur suivante:

RuntimeError: inconsistent tensor size at /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensorMath.c:503

Toutes les idées comment un simple produit scalaire peut être effectuée en P yTorch?

Répondre

13

Vous cherchez

torch.mm(a,b) 

Notez que torch.dot() se comporte différemment à np.dot(). Il y a eu une discussion sur ce qui serait souhaitable here. Spécifiquement, torch.dot() traite à la fois a et b comme des vecteurs 1D (indépendamment de leur forme originale) et calcule leur produit interne. L'erreur est levée, car ce comportement fait de votre a un vecteur de longueur 6 et votre b un vecteur de longueur 2; Par conséquent, leur produit interne ne peut pas être calculé. Pour la multiplication matricielle dans PyTorch, utilisez torch.mm(). Au contraire, le np.dot() de Numpy est plus flexible; Il calcule le produit interne pour les tableaux 1D et effectue une multiplication matricielle pour les tableaux 2D.

5

bâtiment sur la réponse mexmex, si vous voulez faire une multiplication matricielle vous pouvez le faire de trois façons:

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

Pour multiplication élément par élément, vous pouvez tout simplement faire (si A et B ont la même forme)

A * B # element-wise matrix multiplication (Hadamard product)