tensorflow:检查标量布尔张量是否为True

时间:2017-04-06 19:14:26

标签: python tensorflow boolean-operations

我想使用占位符控制函数的执行,但不断收到错误“不允许使用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() 

3 个答案:

答案 0 :(得分:6)

您必须使用tf.cond在图表中定义条件操作,然后更改张量的流程。

$str = 'z';
var_dump(++$str)
  

10

答案 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