web-dev-qa-db-ja.com

TensorFlowは、可変サイズのプレースホルダーをベクトルと連結します

プレースホルダーがあるとしましょう

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

とベクトル

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

この例では、簡単にするためにhはゼロで埋められていますが、実際の場合、他の変数によって変更され、異なる値になります。

ph_inputconcatを効率的に実行し、次元1hを実行して、形状[None, 1+2]の新しいテンソルを取得したいと思います。残念ながら、concatは、私の例では満たされないconcat_dimを除いて、すべての入力テンソルが同じ形状である必要があります。

hph_inputにフィードするデータと同じ形状に展開することを検討していましたが、プレースホルダー自体でそれを行う方法が正確にはわかりません。入力データから直接形状を取得する場合は、プレースホルダーを使用する必要はないと思います。

14
bxshi

最も一般的な解決策は、 tf.shape() opを使用してプレースホルダーの実行時サイズを取得し、 tf.tile() を使用することです。 hを適切なサイズに拡張するためのop:

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])
16
mrry