在写程序时,用tf.cond函数设置条件控制时出错
raise TypeError("true_fn must be callable.")
TypeError: true_fn must be callable.
捣鼓了一下午加一晚上,最后找到错误地方为tf.cond的标准传入参数为
tf.cond(pred,true_fn = None,false_fn = None,fn1=None,fn2=None)
传入的条件函数参数引起这个错误,但不是函数本身引起的问题,应该传入函数写为:
tf.cond(pred, lambda : train, lambda : inference)
某些参数已弃用。它们将在将来的版本中被删除。有关更新的说明: fn1/fn2 不推荐使用,支持使用 true_fn/false_fn 参数。
true_fn 和 false_fn 都返回输出张量的列表。true_fn 和 false_fn 必须具有相同的非零数和输出类型。
请注意, 条件执行仅适用于在 true_fn 和 false_fn 中定义的操作. 请考虑以下简单程序:
z = tf.multiply( a , b ) result = tf.cond( X < Y, lambda:tf.add( X ,Z), lambda: tf.square( Y ))
如果x < y,tf.add 将执行并且 tf.square 操作不执行。因为 z 是需要的至少一个分支的条件,因为 tf.multiply 操作始终无条件地执行。虽然这种行为与 TensorFlow 的数据流模型是一致的,但有时候,有些用户会期待一种较为惰性的语义。
请注意,cond 调用 true_fn 和 false_fn 一次(在调用 cond 的内部,而不是在 Session.run()期间 )。cond 将在 true_fn 和 false_fn 期间创建的图形片段一起使用一些附加的图形节点来确保右分支根据 pred 的值执行。
tf.cond 支持嵌套结构在 tensorflow.python.util.nest 中的实现。true_fn 和 false_fn 必须返回列表,元组和/或命名元组的相同(可能嵌套的)值结构。
单例列表和元组是唯一的例外:当由 true_fn 或者 false_fn 隐式解压缩到单个值时。通过传递 strict=True 禁用此行为。
这样就不会报错了,又踩了一个坑!