2017-06-13 100 views
6

W numpy mogę zrobić proste mnożenie macierzy tak:Jak zrobić iloczynu skalarnego macierzy w PyTorch

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

Jednak, gdy próbuję to z PyTorch tensorów, to nie działa:

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

Ten kod wyrzuca następujący błąd:

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

pomysłów jak prosty produkt kropka może być prowadzona w P YTorch?

Odpowiedz

13

Szukacie

torch.mm(a,b) 

Zauważ, że torch.dot() zachowuje się inaczej do np.dot(). Było trochę dyskusji na temat tego, co byłoby pożądane: here. W szczególności, torch.dot() traktuje zarówno a i b jako wektory 1D (niezależnie od ich oryginalnego kształtu) i oblicza ich wewnętrzny produkt. Błąd jest generowany, ponieważ to zachowanie powoduje, że twój wektor o długości 6 i twój b jest wektorem o długości 2; stąd ich wewnętrzny produkt nie może być obliczony. W przypadku mnożenia macierzy w PyTorch użyj torch.mm(). Numpy's np.dot() jest z kolei bardziej elastyczny; oblicza wewnętrzny produkt dla macierzy 1D i wykonuje mnożenie macierzy dla tablic 2D.

5

Opierając się na odpowiedź mexmex, jeśli chcesz zrobić mnożenia macierzy można to zrobić na trzy sposoby:

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

Dla elementu mnożenie, można po prostu zrobić (jeśli A i B mają takie same kształt)

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