我想使用占位符控制函数的执行,但不断收到错误“不允许使用tf.Tensor作为Python bool”。以下是产生此错误的代码:
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
更改为if c is not None
。如何通过打开和关闭占位符foo
来控制a
?
更新:@nessuno和@nemo指出,我们必须使用tf.cond
代替if..else
。我的问题的答案是重新设计我的功能:
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()
答案 0 :(得分:6)
答案 1 :(得分:1)
实际执行不是在Python中完成的,而是在TensorFlow后端中提供的计算图,它应该执行。这意味着您要应用的每个条件和流量控制都必须表示为计算图中的节点。
对于if
条件,有cond
操作:
b = tf.cond(c,
lambda: tf.constant(10),
lambda: tf.constant(0))
答案 2 :(得分:0)
解决问题的简单方法:
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