2016-03-16 2 views
10

Скажем, у меня есть заполнительTensorFlow Concat переменного размера заполнитель с вектором

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

и вектор

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

В этом примере h заполняется нулями для простоты но в реальном случае он будет изменен другими переменными и будет иметь разные значения.

Я хочу, чтобы эффективно сделать concat на ph_input и h на измерении 1 и получить новый тензор с формой [None, 1+2]. К сожалению, concat требует, чтобы все входные тензоры имели ту же форму, кроме concat_dim, что мой пример не встречается.

Я рассматривал возможность расширения h на ту же форму, что и данные, которые подаются до ph_input, но я не совсем уверен, как это сделать с самим заполнителем. Если я получаю форму из входных данных напрямую, то, я думаю, нет необходимости использовать заполнитель.

ответ

12

Наиболее общее решение использовать tf.shape() цит, чтобы получить размер во время выполнения в заполнитель, и tf.tile() цит расширить h до соответствующего размера:

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. Работал для меня с tf 10 и 11. –

+1

пакет был переименован в стек! – Rahul

Смежные вопросы