2017-02-11 14 views
1

Ich implementiere ein neuronales Netzwerk in Python, als Teil der Backpropagation muss ich eine 3D-Matrix multiplizieren, nennen Sie es A, Dimension (200, 100, 1), durch eine 2D-Matrix, nennen Sie es W, Dimension (100, 200) Das Ergebnis sollte die Abmessungen (200, 200, 1) haben.Multidimensionale Matrixmultiplikation auf numpy Array

A ist ein Fehlervektor, W ist eine Gewichtsmatrix, das Produkt wird verwendet, um die Aktualisierungen für die vorherige Schicht zu berechnen.

ich versuchte, es unter Verwendung matrix_multiply (from numpy.core.umath_tests) zu lösen, habe ich versucht, W (100,200,1) Umformen und dann Multiplikation, aber das führt

ValueError: matrix_multiply: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (m,n),(n,p)->(m,p) (size 100 is different from 1).

Wie kann ich das lösen?

+0

Haben Sie einen zwingenden Grund dafür, die Form von "A" als (200, 100, 1) zu behalten, statt die triviale Dimension fallen zu lassen und ihre Form zu erhalten (200, 100)? –

+0

@WarrenWeckesser Ich habe diese Option nicht berücksichtigt. Danke für den Vorschlag, ich werde es erkunden. – dpk

Antwort

3

könnten Sie verwenden np.tensordot und dann permute Achsen mit swapaxes oder einfach reshape -

np.tensordot(A,W,axes=((1),(0))).swapaxes(1,2) 
np.tensordot(A,W,axes=((1),(0))).reshape(A.shape[0],W.shape[1],1) 

Alternativ können wir np.dot mit der nur Scheibe entlang der letzten Achse der A und dann nach Matrix-Multiplikation erweitern verwenden, um in 3D -

A[:,:,0].dot(W)[...,None] 

Oder können wir verwenden np.einsum -

np.einsum('ijk,jl->ilk',A,W)