2016-03-16 26 views
10

Diciamo ho un segnapostotensorflow concat un segnaposto variabile dimensioni con un vettore

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

e un vettore

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

In questo esempio h è riempito con zeri per semplicità ma nel caso reale verrà modificato da altre variabili e avrà valori diversi.

che voglio fare in modo efficiente una concat su ph_input e h sulla dimensione 1 e ottenere un nuovo tensore di forma [None, 1+2]. Sfortunatamente, concat richiede che tutti i tensori di ingresso abbiano la stessa forma eccetto lo concat_dim, che il mio esempio non soddisfa.

Stavo considerando espandere h alla stessa forma dei dati che alimentano a ph_input ma non sono esattamente sicuro come farlo con il segnaposto stesso. Se ottengo direttamente la forma dai dati di input, suppongo che non sia necessario utilizzare il segnaposto.

risposta

12

La soluzione più generale è quello di utilizzare il tf.shape() op per ottenere la dimensione di run-time del segnaposto, e il tf.tile() op per espandere h alla dimensione appropriata:

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

Perfetto. Ha funzionato per me con i numeri 10 e 11. Il pacchetto –

+1

è stato rinominato come stack! – Rahul