2017-06-13 16 views
6

In numpy zu tun, kann ich eine einfache Matrixmultiplikation wie folgt tun:Wie Skalarprodukt von Matrizen in PyTorch

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

Allerdings, wenn ich das versuche, mit PyTorch Tensoren, das nicht funktioniert:

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

Dieser Code führt den folgenden Fehler:

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

Irgendwelche Ideen, wie ein einfaches Punktprodukt kann in P durchgeführt werden yTorch?

Antwort

13

Sie suchen

torch.mm(a,b) 

Beachten Sie, dass torch.dot() anders np.dot() verhält. Es gab einige Diskussionen darüber, was wünschenswert wäre here. Spezifisch behandelt torch.dot() sowohl a als auch b als 1D-Vektoren (unabhängig von ihrer ursprünglichen Form) und berechnet ihr inneres Produkt. Der Fehler wird ausgelöst, weil dieses Verhalten Ihren a einen Vektor der Länge 6 und Ihren b einen Vektor der Länge 2 macht; daher kann ihr inneres Produkt nicht berechnet werden. Verwenden Sie für die Matrixmultiplikation in PyTorch torch.mm(). Numpys np.dot() ist dagegen flexibler; Es berechnet das innere Produkt für 1D-Arrays und führt Matrixmultiplikation für 2D-Arrays durch.

5

Aufbauend auf mexmex Antwort, wenn Sie eine Matrix-Multiplikation tun Sie es auf drei Arten tun:

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

Für elementweise Multiplikation, können Sie einfach tun (wenn A und B haben die gleiche Form)

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