2017-10-01 6 views
0

私は過去にこの主題を捜したが、実際の解決策を見つけたことはなかった。Tensorflow、tf.equalsをブール値として利用するには?

リスト( "iterateOverMe")を反復処理し、指定された値( "value")と等しいすべての要素を "1"で置き換えるラムダ関数があります。それ以外の値には "9"とマークする必要があります。 「TypeError例外:

idk = tf.map_fn(lambda x: 1 if tf.equal(tf.cast(x, tf.int32), value) else 9, iterateOverMe, dtype=tf.int32) 

は、しかし、私は次というエラーメッセージが表示されます。Pythonのboolが許可されていないtf.Tensorとして使用しテンソルが定義されているかどうかをテストする代わりにif t:if t is not None:を使用し、TensorFlowオプスを使用しますテンソルの値に条件付けされた部分グラフを実行するためのtf.condのようなものです。

しかし、少なくともtf.equalステートメントを直接印刷すると、期待されるTrue/False値が得られます。

私が試したこと。

1:テンソルでreduce_allを使用しても機能しませんでしたが、私はまだ同じエラーが発生しています。

TypeError:tf.TensorをPython boolとして使用することはできません。テンソルが定義されているかどうかをテストするには、if t:の代わりにif t is not None:を使用し、テンソルの値に条件付けられたサブグラフを実行するには、tf.condのようなTensorFlowオペレーションを使用します。

2: "tがNoneではない場合"を使用してください。何も関係なく、Noneとは一見同じではないため動作しませんでした。

私はこのような1のリストを取得します。これは悲しいことですが間違っています。

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 

3:tf.condを使用して同様に試しました。しかし、私は真実を返そうとしているので、まったく動作しません。呼び出し可能なものが必要です。 idk = tf.map_fn(lambda x:tf.cond(tf.equal(tf.int32)、iterator)、True、False)else -1、modifiedTrainingLabels、dtype = tf.int32)

4:これは...この嫌なこともうまくいきませんでした。

idk = tf.map_fn(lambda x: 1 if tf.cond(tf.equal(tf.cast(x, tf.int32), iterator), lambda : True, lambda: False) else 9, modifiedTrainingLabels, dtype=tf.int32) 

答えて

0

あなたは並列にテンソル内の複数の場所で条件を評価tf.where()操作、でこれを行うことができます。与えられた形状のテンソルを生成するtf.fill()オペレーション。

iterateOverMevalueと呼ばれる目標値と呼ばれる、あなたは10の値のtf.Tensorを持っているとしましょう:

iterateOverMe = ...          # shape: (10,) 

mask = tf.equal(tf.cast(iterateOverMe, tf.int32), value) # shape: (10,) 

result = tf.where(mask, 
        tf.fill(tf.shape(iterateOverMe), 1), # If `mask` is true. 
        tf.fill(tf.shape(iterateOverMe), 9)  # If `mask` is false. 
       )          # shape: (10,) 
関連する問題