Numpyでは、同じ形状の2つの配列x
とy
を使用して、この_y[x > 1]
_のようなスライスを行うことができます。テンソルフローで同じ結果をどのように達成しますか? y[tf.greater(x, 1)]
は機能せず、_tf.slice
_もこのようなものをサポートしません。現在ブールテンソルでインデックスを作成する方法はありますか、それとも現在サポートされていませんか?
試してください:
ones = tf.ones_like(x) # create a tensor all ones
mask = tf.greater(x, ones) # boolean tensor, mask[i] = True iff x[i] > 1
slice_y_greater_than_one = tf.boolean_mask(y, mask)
tf.boolean_mask を参照してください
[〜#〜] edit [〜#〜]:別の(より良い?)方法:
import tensorflow as tf
x = tf.constant([1, 2, 0, 4])
y = tf.Variable([1, 2, 0, 4])
mask = x > 1
slice_y_greater_than_one = tf.boolean_mask(y, mask)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print (sess.run(slice_y_greater_than_one)) # [2 4]
完全に実装されているとは言いません。ダブルネガティブはどうですか?
Tensorflowは実際には非常に多くのスライスとダイシングをサポートしていますが、構文はややきれいではありません。たとえば、x>1
の場合はy
に等しく、それ以外の場合は0に等しい新しい配列を作成する場合は、間違いなくそれを行うことができます。 比較演算子 をご覧ください。
masked = tf.greater(x,1)
zeros = tf.zeros_like(x)
new_tensor = tf.where(masked, y, zeros)
一方、x>1
の人だけを含む新しい配列を作成したい場合は、where
をgather
関数と組み合わせることでそれを行うことができます。 gather
の詳細については、次を参照してください。
https://www.tensorflow.org/versions/master/api_docs/python/array_ops/slicing_and_joining
PS。もちろん、x>1
はx
に関して微分可能ではありません... tfは素晴らしいかもしれませんが、魔法のようには動作しません:)。
これは現時点では実装されていません。進行状況を追跡するGitHubの問題があります- https://github.com/tensorflow/tensorflow/issues/206
定義された基準によってTensorFlow.jsテンソルを削減する同様の機能を探していましたが、TensorFlow.jsにはboolean_mask関数がありません。多くの髪を引っ張って歯をかじった後、以下を調理しました。これは基本的に真の基準の合計数を合計し、次に単純にtopk値を選択してサブセットテンソルを作成しました。
const a = tf.tensor1d([1, 2, 0, 4]);
const b = a.greater(1).sum().get();
const {values, indices} = tf.topk(a, b);
values.print(); # 4,2
indices.print(); # 3,1
そして、1以下の値のサブセットテンソルを作成するには、botkk関数がないためテンソルでtf.negを使用し、topkを介してサブセットテンソルを取得した後、tf.negを再度適用して復元します元の値。