2016-03-16 5 views
10

Lassen Sie uns sagen, ich habe einen PlatzhalterTensorFlow concat ein variabler Größe Platzhalter mit einem Vektor

ph_input = tf.placeholder(dtype=tf.int32, [None, 1])

und ein Vektor

h = tf.zeros([1,2], dtype=tf.int32)

In diesem Beispiel h mit Nullen für Einfachheit gefüllt aber im tatsächlichen Fall wird es durch andere Variablen geändert und hat andere Werte.

Ich möchte effizient eine concat auf ph_input und h auf Dimension zu tun 1 und einen neuen Tensor mit Form [None, 1+2] bekommen. Leider benötigt concat alle Eingangstensoren mit der gleichen Form außer der concat_dim, die mein Beispiel nicht erfüllt.

Ich erwog Erweiterung h zu der gleichen Form wie die Daten, die ph_input Feed aber bin nicht genau sicher, wie das mit dem Platzhalter selbst zu tun. Wenn ich die Form direkt aus den Eingabedaten erhalte, dann ist es nicht notwendig, den Platzhalter zu verwenden.

Antwort

12

Die allgemeinste Lösung ist, die tf.shape() op zu verwenden, um die Laufzeit Größe des Platzhalter zu bekommen, und den tf.tile() op h auf die entsprechende Größe zu erweitern:

ph_input = tf.placeholder(dtype=tf.int32, shape=[None, 1]) 
h = tf.zeros([1, 2], dtype=tf.int32) # ...or some other tensor of shape [1, 2] 

# Get the number of rows in the fed value at run-time. 
ph_num_rows = tf.shape(ph_input)[0] 

# Makes a `ph_num_rows x 2` matrix, by tiling `h` along the row dimension. 
h_tiled = tf.tile(h, tf.pack([ph_num_rows, 1])) 

result = tf.concat(1, [ph_input, h_tiled]) 
+0

Perfect. Arbeitete für mich mit tf 10 und 11. –

+1

Pack wurde umbenannt, um zu stapeln! – Rahul