2017-11-29 4 views
1

ich zwei Tensoren der folgenden Formen haben:Tensorflow sequentielle Matrix-Multiplikation

tensor1 => shape(?, ?, 100) # corresponds to [batch_size, max_time, embedding_size] 
tensor2 => shape(?, 100) # corresponds to [batch_size, embedding_size] 

Was ich möchte, ist in tensor2 für jeden [100] dimensional Vektor zu tun mit entsprechenden [max_time, 100] dimensional Matrix in tensor1 eine Matrixmultiplikation erhalten zu bekommen batch_size Anzahl der max_time dimensionale Vektoren; Das ist das gleiche wie eine [batch_size, max_time] dimensional Matrix.

Für diejenigen, die wissen: Ich versuche im Grunde, die inhaltliche Aufmerksamkeit über die codierten Eingaben zu implementieren, die vom Kodierer eines seq2seq Modells gegeben werden. Alle [max_time] dimensionalen Vektoren sind nur die Aufmerksamkeitswerte, die ich später softmax.

Ich bin mir bewusst, dass Tensorflow bietet die AttentionWrapper sowie verschiedene Helfer in der contrib Paket. Ich möchte dies jedoch tun, weil ich mit dem Aufmerksamkeitsmechanismus experimentiere, um eine hybride Aufmerksamkeitsmaske zu erhalten.

Ich habe versucht, die aber, blieb in der ? Form, um die Schleife zu entrollen. Eine vektorisierte Implementierung erscheint mir auch nicht sehr geradlinig. Bitte helfen Sie.

Antwort

1

Was Sie tun können, ist tf.matmul verwenden und Ihre Vektoren wie 100 * 1 Matrizen behandeln.

tensor2 = tf.expand_dims(tensor2, 2) 
result = tf.matmul(tensor1, tensor2) 
+0

Vielen Dank für die schnelle Antwort (hilft viel). Ich wusste nicht, dass das 'tf.matmul' ein anderes Verhalten für Argumente hat, die einen' Rang> 2' haben. –