web-dev-qa-db-ja.com

ブールテンソルを使用したTensorflowインデックス作成

Numpyでは、同じ形状の2つの配列xyを使用して、この_y[x > 1]_のようなスライスを行うことができます。テンソルフローで同じ結果をどのように達成しますか? y[tf.greater(x, 1)]は機能せず、_tf.slice_もこのようなものをサポートしません。現在ブールテンソルでインデックスを作成する方法はありますか、それとも現在サポートされていませんか?

19

試してください:

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]
15
Mr_and_Mrs_D

完全に実装されているとは言いません。ダブルネガティブはどうですか?

Tensorflowは実際には非常に多くのスライスとダイシングをサポートしていますが、構文はややきれいではありません。たとえば、x>1の場合はyに等しく、それ以外の場合は0に等しい新しい配列を作成する場合は、間違いなくそれを行うことができます。 比較演算子 をご覧ください。

masked = tf.greater(x,1)
zeros = tf.zeros_like(x)
new_tensor = tf.where(masked, y, zeros)

一方、x>1の人だけを含む新しい配列を作成したい場合は、wheregather関数と組み合わせることでそれを行うことができます。 gatherの詳細については、次を参照してください。

https://www.tensorflow.org/versions/master/api_docs/python/array_ops/slicing_and_joining

PS。もちろん、x>1xに関して微分可能ではありません... tfは素晴らしいかもしれませんが、魔法のようには動作しません:)。

6
Jackson Loper

これは現時点では実装されていません。進行状況を追跡するGitHubの問題があります- https://github.com/tensorflow/tensorflow/issues/206

3

定義された基準によって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を再度適用して復元します元の値。

1
Jon Trent