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, но я не совсем уверен, как это сделать с самим заполнителем. Если я получаю форму из входных данных напрямую, то, думаю, нет необходимости использовать заполнитель.

Ответ 1

Самое общее решение - использовать tf.shape() op, чтобы получить размер времени выполнения заполнитель, а tf.tile() op для расширения 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])