2016-03-21 4 views
1

第1次元が未知のテンソルx(例:[?, 32, 32, 3])、実際にはスカラーのテンソルiがあるとします。 xの最初の次元で分割されたi番目のスライスを得る良い方法はありますか?例えば、テンソルの次元を得るには[32, 32, 3]?私はTensorFlowを初めて使い、この非常に不器用な解決策しか考え出すことができませんでした。TensorFlowで別のテンソルによって部分的にインデックスされたスライスを得るうまい方法はありますか?

index = tf.concat(0, [i, tf.constant([0, 0, 0], tf.int64)]) 
size = [1, x.get_shape()[1].value, x.get_shape()[2].value, x.get_shape()[3].value] 
result = tf.unpack(tf.slice(x, index, size))[0] 

答えて

3

あなたは-1「は、その次元のすべての残りの要素」を意味する、tf.slice()size引数に特別な引数であるという事実を利用することができます。次に、あなたが行うことができます(あなたのコードスニペットであるように思わとしてではなく長さ1のベクトル)iがスカラーであると仮定すると:

result = tf.squeeze(tf.slice(x, tf.pack([index, 0, 0, 0]), [1, -1, -1, -1]), [0]) 

また、あなたがから1つのまたは複数のスライスを選択するために、tf.gather()を使用することができます0次元のテンソル。この場合、iはベクトルでなければならない。いずれの場合も

i = tf.expand_dims(i, 0) # Converts `i` to a vector if it is a scalar. 
result = tf.squeeze(tf.gather(x, i), [0]) 

tf.squeeze() OPは、三次元の結果を与える第0寸法を除去します。

関連する問題