阅读(251) (15)

tf.cond函数的使用

2017-09-12 15:13:53 更新

tf.cond

cond ( 
    pred , 
    true_fn = None , 
    false_fn = None , 
    strict = False , 
    name = None , 
    fn1 = None , 
    fn2 = None
 )

定义在:tensorflow/python/ops/control_flow_ops.py.

请参阅指南:控制流程>控制流程操作

在TensorFlow中,tf.cond()类似于c语言中的if...else...,用来控制数据流向,但是仅仅类似而已,其中差别还是挺大的。关于tf.cond()函数的具体操作,我参考了tf的说明文档。

format:tf.cond(pred, fn1, fn2, name=None)

Return :either fn1() or fn2() based on the boolean predicate `pred`.(注意这里,也就是说'fnq'和‘fn2’是两个函数)

arguments:`fn1` and `fn2` both return lists of output tensors. `fn1` and `fn2` must have the same non-zero number and type of outputs('fnq'和‘fn2’返回的是非零的且类型相同的输出)

如果断言 pred 为 true ;则返回 true_fn() ,否则返回 false_fn().(弃用参数)

某些参数已弃用.它们将在将来的版本中被删除.有关更新的说明: 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 禁用此行为.

ARGS:

  • pred:标量决定是否返回 true_fn 或 false_fn 结果.
  • true_fn:如果 pred 为 true,则被调用.
  • false_fn:如果 pred 为 false,则被调用.
  • strict:启用/禁用 “严格”模式的布尔值.
  • name:返回的张量的可选名称前缀.

返回:

通过调用 true_fn 或 false_fn 返回的张量.如果 callables 返回单一实例列表, 则从列表中提取元素.

注意:

  • TypeError: 如果 true_fn 或 false_fn 是不可调用的.
  • ValueError:如果 true_fn 和 false_fn 不返回相同数量的张量, 或返回不同类型的张量.

例:

x = tf.constant(2 ) 
y = tf.constant(5 )
def  f1 (): return tf .multiply( x , 17 )
def  f2 (): return tf .add ( y , 23 ) 
r = tf .cond( tf.less( X ,y ), f1 , f2 )
#r 设置为f1().
#f2 中的操作(例如,tf.add)不执行.