2017-09-14 1 views
2

So habe ich Array A mit Form [32,60,60] und Array B mit Form [32,60]. Die erste Dimension ist die Stapelgröße, also ist die erste Dimension unabhängig. Was ich tun möchte, ist eine einfache Matrix durch Vektormultiplikation. Also für jede Probe in A Ich möchte Matrix der Form [60,60] mit Vektor der Form [60] multiplizieren. Multiplikation über die Charge A * B sollte mir eine Reihe von Form geben [32,60].Wie multipliziere ich einen Tensor mit einer Matrix

Dies sollte einfach sein, aber ich mache etwas falsch:

>>> v = np.matmul(A,B) 
ValueError: shapes (32,60,60) and (32,60) not aligned: 60 (dim 2) != 32 (dim 0) 

Dies ist für tensorflow, aber eine numpy Antwort genügen kann, wenn ich die Schreibweise umwandeln kann.

Antwort

2

Es scheint, Sie versuchen sum-reduce die letzten Achsen von den beiden Eingabe-Arrays mit dem matrix-multiplication. Also, mit np.einsum, wäre es -

np.einsum('ijk,ik->ij',A,B) 

Für tensorflow wir tf.einsum verwenden können.


Mit np.matmul müssen wir B zu 3D erweitern, indem eine neue Achse in der letzten einzuführen. Somit würde unter Verwendung von np.matmul die zweite Achse B's erweiterte Version sum-reduced gegen die dritte von A erhalten. Das Ergebnis wäre 3D. Also, die letzte Singleton-Achse mit dem Schneiden oder np.squeeze ausgequetscht bekommen. Daher wäre die Umsetzung sein -

np.matmul(A,B[...,None])[...,0] 

Wir haben bereits eine bestehende tf.matmul Funktion dort haben.

+0

Das tf.einsum wirkt wie ein Zauber. Ich war mir nicht bewusst einsum. Vielen Dank! – vega

Verwandte Themen