2017-04-06 7 views
2

プレースホルダーを使用して関数の実行を制御したいが、 "tf.ToolsorをPython boolとして使用することはできない"というエラーが発生する。ここでは、このエラーを生成したコードは次のとおりです。tensorflow:スカラーブールテンソルがTrueであるかどうかを調べる

import tensorflow as tf 
def foo(c): 
    if c: 
    print('This is true') 
    #heavy code here 
    return 10 
    else: 
    print('This is false') 
    #different code here 
    return 0 

a = tf.placeholder(tf.bool) #placeholder for a single boolean value 
b = foo(a) 
sess = tf.InteractiveSession() 
res = sess.run(b, feed_dict = {a: True}) 
sess.close() 

私は運なしif c is not Noneif cを変更しました。プレースホルダaをオンまたはオフにして、fooを制御するにはどうすればよいですか?

更新:@nessunoと@nemoが指摘するとおり、if..elseの代わりにtf.condを使用する必要があります。私の質問への答えは、このような再設計し、私の機能にある:

import tensorflow as tf 
def foo(c): 
    return tf.cond(c, func1, func2) 

a = tf.placeholder(tf.bool) #placeholder for a single boolean value 
b = foo(a) 
sess = tf.InteractiveSession() 
res = sess.run(b, feed_dict = {a: True}) 
sess.close() 

答えて

6

あなたは、このように、グラフや変更内テンソルの流れを条件付きの操作を定義するためにtf.condを使用する必要があります。

import tensorflow as tf 

a = tf.placeholder(tf.bool) #placeholder for a single boolean value 
b = tf.cond(tf.equal(a, tf.constant(True)), lambda: tf.constant(10), lambda: tf.constant(0)) 
sess = tf.InteractiveSession() 
res = sess.run(b, feed_dict = {a: True}) 
sess.close() 
print(res) 

10

+0

'foo'機能は実際には非常に複雑です。私はちょうどその機能のいくつかの操作を 'a'をオン/オフすることによって変更したいと思います。 'foo'関数をどのように保つことができますか?私は問題が '{a:True} 'か' c: 'のどちらかであると考えます。 –

+1

条件が評価されたときに実行する2つの異なる関数を定義するだけで済みます。唯一の制限は、両方とも同じ数と型の値を返さなければならないことです。したがって、ラムダの代わりに、独自の関数を定義して使用することができます – nessuno

1

実際の実行は、Pythonでいますが、実行することになっている計算グラフで供給TensorFlowバックエンドで行われていません。つまり、適用したいすべての条件とフロー制御を計算グラフのノードとして定式化する必要があります。それに取り組む

b = tf.cond(c, 
      lambda: tf.constant(10), 
      lambda: tf.constant(0)) 
0

簡単な方法:

if条件についてcond操作があり

In [50]: a = tf.placeholder(tf.bool)                                             

In [51]: is_true = tf.count_nonzero([a])                                            

In [52]: sess.run(is_true, {a: True})                                             
Out[52]: 1 

In [53]: sess.run(is_true, {a: False}) 
Out[53]: 0 
関連する問題