TensorFlow 控制流程

注意:接受 Tensor 参数的函数也可以接受任何接受的内容 tf.convert_to_tensor.

TensorFlow 控制流程操作

TensorFlow 提供了几个操作和类,您可以使用它们来控制操作的执行并向图中添加条件依赖关系.

tf.identity

identity

tf.tuple

将张量组合在一起.
这将创建一个与 tensors 参数具有相同值的张量元组,但是每个张量的值仅在所有张量的值已经被计算之后才返回.
control_inputs 包含此操作完成之前必须完成的其他操作,但其输出未返回.
这可以用作并行计算的“连接”机制:所有参数张量可以并行计算,但 tuple 返回的任何张量返回的值仅在所有并行计算完成后才可用.

另请参阅 tf.group和 tf.control_dependencies.

函数原型

tf.tuple(
    tensors,
    name=None,
    control_inputs=None
)

函数参数:

  • tensors:Tensors 或者 IndexedSlices 列表,一些条目的可以是 None.
  • name:(可选)用作 name_scope 操作的名称.
  • control_inputs:返回之前完成的其他操作的列表.

函数返回值

  • tf.tuple 函数的返回值与 tensors 相同.

可能引发的异常:

  • ValueError:如果 tensors 不包含任何 Tensor 或 IndexedSlices.
  • TypeError:如果 control_inputs 不是一个 Operation 或 Tensor 对象列表.

tf.group

创建一个操作,该操作可以对 TensorFlow 的多个操作进行分组.
当这个操作完成后,所有 input 中的所有 ops 都已完成.这个操作没有输出.
另请参见 tuple 和 control_dependencies 获得更多信息.

函数原型

group(
    *inputs,
    **kwargs
)

函数参数:

  • input:需要进行分组的零个或多个张量.
  • kwargs:构造 NodeDef 时要传递的可选参数.
  • name:此操作的名称(可选).

函数返回值

  • 该函数返回执行其所有输入的操作.

可能引发的异常:

  • ValueError:如果提供了一个未知的关键字参数.

tf.no_op

no_op

tf.count_up_to

递增 ‘ref’,直到达到 “limit”.

原型

count_up_to ( 
    ref , 
    limit , 
    name = None
 )

参数

  • ref:一个可变的张量.必须是以下类型之一:int32,int64.应来自标量的变量节点.
  • limit:一int.如果递增 ref 将使其超出 limit,则会生成 “OutOfRange” 错误.
  • name:操作的名称(可选).

返回值

返回一个张量,与 ref 具有相同的类型.

增量前的输入副本.如果没有其他内容的修改输入,则生成的值都将是不同的.

tf.cond

如果断言 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 禁用此行为.

参数

  • 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)不执行.

tf.case

原型

case (  
    pred_fn_pairs ,  
    default ,  
    exclusive = False ,  
    strict = False ,  
    name = 'case' 
)

解释

创建案例操作.
pred_fn_pairs 参数是字典或大小对的列表.每对都包含一个布尔标量张量和一个可调用的 python, 如果布尔计算结果为 True, 则创建要返回的数量.默认值是一个可调用的生成张量列表.pred_fn_pairs 中的所有 callables 以及默认值都应返回相同的张量和类型.
如果 exclusive = = true, 则计算所有谓词, 如果有多个谓词的计算结果为 true, 则引发异常.如果 exclusive = = False, 则执行停止是计算结果为 True 的第一个谓词, 并立即返回相应函数生成的张量.如果没有任何谓词计算为 True, 则此操作返回默认情况下生成的张量.

tf.case 支持在 tensorflow.python.util.nest 中实现的嵌套结构.所有的 callables 必须返回列表、元组和/或命名元组的相同 (可能是嵌套的) 值结构.单例列表和元组是唯一的例外: 当由可调用返回时, 它们被隐式解压到单个值.通过 strict = True 来禁用此行为.
如果使用无序字典 pred_fn_pairs, 则不保证条件测试的顺序.但是, 该顺序保证是确定性的, 以便在条件分支中创建的变量在运行时按固定顺序创建.

例子

示例1:伪码:


if (x < y) return 17;
else return 23;

表达式:

f1 = lambda: tf.constant(17)
f2 = lambda: tf.constant(23)
r = case([(tf.less(x, y), f1)], default=f2)

示例2:伪码:

if (x < y && x > z) raise OpError("Only one predicate may evaluate true");
if (x < y) return 17;
else if (x > z) return 23;
else return -1;

表达式:

def f1(): return tf.constant(17)
def f2(): return tf.constant(23)
def f3(): return tf.constant(-1)
r = case({tf.less(x, y): f1, tf.greater(x, z): f2},
         default=f3, exclusive=True)

参数

  • pred_fn_pairs:字典或一组布尔标量张量和一个可调用的列表,其返回张量列表.
  • default:可以返回张量列表的可调用函数.
  • exclusive:如果允许最多一个谓词可以评估,则为真True.
  • strict:启用/禁用“严格”模式的布尔值.
  • name:此操作的名称(可选).

返回

  • 由谓词计算为 True 的第一对返回的张量,或者默认情况下返回的张量 (如果没有).

注意

  • TypeError:当 pred_fn_pairs 不是列表/字典.
  • TypeError:当 pred_fn_pairs 是一个列表,但不包含2元组.
  • TypeError:当 fns [i] 对任何 i 不可调用, 或者默认不可调用.

tf.while_loop

函数原型

tf.while_loop(
    cond,
    body,
    loop_vars,
    shape_invariants=None,
    parallel_iterations=10,
    back_prop=True,
    swap_memory=False,
    name=None,
    maximum_iterations=None
)

解释

在条件cond成立时重复body.

cond是可返回的布尔标量张量;body是一个可调用的函数,它返回一个(可能是嵌套的)元组、namedtuple或者与loop_vars具有相同arity(长度和结构)和类型的张量列表;loop_vars是一个(可能是嵌套的)元组,namedtuple或被传递给cond和body的张量的列表.cond和body的参数都尽可能的和loop_vars一样多.

除了常规的Tensors或IndexedSlices,body可以接受并返回TensorArray对象.TensorArray对象的流将在循环之间和梯度计算期间适当地转发.

请注意,while_loop只调用cond和body一次(调用while_loop内,而不是在所有Session.run()期间).while_loop将在cond和body调用期间创建的图片段拼接在一起,并添加一些额外的图形节点,以创建重复body的图形流,直到cond返回false为止.

为了正确性,tf.while_loop()严格执行循环变量的形状不变量.形状不变是一个(可能是部分)形状,在整个迭代循环中不变.如果迭代之后的循环变量的形状被确定为比形状不变性更一般或不兼容,则会引发错误.例如,[11,None]的形状比[11,17]的形状更普遍,[11,21]与[11,17]不兼容.默认情况下(如果没有指定shape_invariants参数),则假设每个迭代中的loop_vars中的每个张量的初始形状是相同的.该shape_invariants参数允许调用者为每个循环变量指定一个不太具体的形状不变量,如果形状在迭代之间变化,则需要该变量.该tf.Tensor.set_shape函数也可以用在body函数中来指示输出循环变量具有特定的形状.

SparseTensor和IndexedSlices的形状不变的定义如下:

  1. 如果循环变量是SparseTensor,则形状不变量必须是TensorShape([r]),其中r是由稀疏张量表示的稠密张量的秩.这意味着SparseTensor的三个张量的形状是([None],[None,r],[r]).注意:此处不变的形状是SparseTensor.dense_shape属性的形状.它必须是矢量的形状.

  2. 如果循环变量是IndexedSlices,则形状不变量必须是IndexedSlices的值张量的形状不变量.这意味着IndexedSlices的三个张量的形状是(shape,[shape [0]],[shape.ndims]).

while_loop实现非严格的语义,允许多个迭代并行运行.并行迭代的最大数量可以通过parallel_iterations控制,这使用户可以控制内存消耗和执行顺序.对于正确的程序,while_loop应该为任何parallel_iterations>0返回相同的结果.

对于训练,TensorFlow存储在正向推断中生成的张量,并且需要反向传播.这些张量是内存消耗的主要来源,并且在GPU上训练时经常会导致OOM错误.当标志swap_memory为true时,我们将这些张量从GPU交换到CPU.例如,这允许我们训练具有很长序列和大批量的RNN模型.

函数参数

  • cond:代表循环终止条件的可调用对象.
  • body:代表循环体的可调用对象.
  • loop_vars:一个(可能是嵌套的)元组,namedtuple或numpy数组、Tensor以及TensorArray对象的列表.
  • shape_invariants:循环变量的形状不变量.
  • parallel_iterations:允许并行运行的迭代次数.它必须是一个正整数.
  • back_prop:表示是否为此while循环启用backprop.
  • swap_memory:此循环是否启用GPU-CPU内存交换.
  • name:返回张量的可选名称前缀.
  • maximum_iterations:要运行的while循环的可选最大迭代次数.如果提供了,则cond输出将与附加条件进行AND运算,以确保执行的迭代次数不超过maximum_iterations.要运行的 while 循环的最大迭代次数.

返回值:

  • 执行循环后循环变量的输出张量.当loop_vars的长度为1时,这是一个Tensor、TensorArray或IndexedSlice,当loop_vars的长度大于1时,它返回一个列表.

可能引发的异常:

  • TypeError:如果cond或者body是不可调用的.
  • ValueError:如果loop_vars是空的.

使用示例:

i = tf.constant(0)
c = lambda i: tf.less(i, 10)
b = lambda i: tf.add(i, 1)
r = tf.while_loop(c, b, [i])

嵌套和namedtuple的示例:

import collections
Pair = collections.namedtuple('Pair', 'j, k')
ijk_0 = (tf.constant(0), Pair(tf.constant(1), tf.constant(2)))
c = lambda i, p: i < 10
b = lambda i, p: (i + 1, Pair((p.j + p.k), (p.j - p.k)))
ijk_final = tf.while_loop(c, b, ijk_0)

使用shape_invariants的示例:

i0 = tf.constant(0)
m0 = tf.ones([2, 2])
c = lambda i, m: i < 10
b = lambda i, m: [i+1, tf.concat([m, m], axis=0)]
tf.while_loop(
    c, b, loop_vars=[i0, m0],
    shape_invariants=[i0.get_shape(), tf.TensorShape([None, 2])])
   

TensorFlow 逻辑运算符

TensorFlow 提供了几种操作,您可以使用它们将逻辑运算符添加到图形中.

tf.logical_and

logical_and

tf.logical_not

not

tf.logical_or

or

tf.logical_xor

xor

TensorFlow 比较运算符

TensorFlow 提供了几种操作,可用于将比较运算符添加到图形中.

tf.equal

https://www.tensorflow.org/api_docs/python/tf/equal

tf.not_equal

返回 (x! = y) 元素的真值.
注意:NotEqual 支持广播.

原型

not_equal(
    x,
    y,
    name=None
)

参数:

  • x:张量.必须是下列类型之一:half,float32,float64,uint8,int8,int16,int32,int64,complex64,quint8,qint8,qint32,string,bool,complex128.
  • y:张量.必须与 x 具有相同的类型.
  • name:操作的名称(可选).

返回值:

  • 该函数将返回一个 bool 类型的张量.

tf.less

以元素方式返回(x 注意:Less支持广播.

原型

less(
    x,
    y,
    name=None
)

参数:

  • x:张量.必须是下列类型之一:float32,float64,int32,int64,uint8,int16,int8,uint16,half.
  • y:张量.必须与 x 具有相同的类型.
  • name:操作的名称(可选).

返回值:

  • 该函数返回 bool 类型的张量.

tf.less_equal

less_equal

tf.greater

[greater(https://www.tensorflow.org/api_docs/python/tf/greater)

tf.greater_equal

greater_equal

tf.where

函数原型

tf.where(
condition,
x=None,
y=None,
name=None
)

解释

根据condition返回x或y中的元素.
如果x和y都为None,则该操作将返回condition中true元素的坐标.坐标以二维张量返回,其中第一维(行)表示真实元素的数量,第二维(列)表示真实元素的坐标.请记住,输出张量的形状可以根据输入中的真实值的多少而变化.索引以行优先顺序输出.

如果两者都不是None,则x和y必须具有相同的形状.如果x和y是标量,则condition张量必须是标量.如果x和y是更高级别的矢量,则condition必须是大小与x的第一维度相匹配的矢量,或者必须具有与x相同的形状.

condition张量作为一个可以选择的掩码(mask),它根据每个元素的值来判断输出中的相应元素/行是否应从 x (如果为 true) 或 y (如果为 false)中选择.

如果condition是向量,则x和y是更高级别的矩阵,那么它选择从x和y复制哪个行(外部维度).如果condition与x和y具有相同的形状,那么它将选择从x和y复制哪个元素.

函数参数:

  • condition:一个bool类型的张量(Tensor).
  • x:可能与condition具有相同形状的张量;如果condition的秩是1,则x可能有更高的排名,但其第一维度必须匹配condition的大小.
  • y:与x具有相同的形状和类型的张量.
  • name:操作的名称(可选).

返回值:

  • 如果它们不是None,则返回与x,y具有相同类型与形状的张量;张量具有形状(num_true, dim_size(condition)).

可能引发的异常:

  • ValueError:当一个x或y正好不是None.

TensorFlow 调试操作

TensorFlow 提供了几种可用于验证值并调试图形的操作.

tf.is_finite

is_finite

tf.is_inf

is_inf

tf.is_nan

返回 X 的元素是 NaN 的.NaN 是代表非数字值的特殊值,用于指示某个值不是数字.

原型

is_nan(
    x,
    name=None
)

参数:

  • x:张量,必须是下列类型之一:half,float32,float64.
  • name:操作的名称(可选).

返回值:

  • bool 类型的张量.

numpy 的兼容性相当于 np.isnan

tf.verify_tensor_all_finite

用于断言(assert)张量不包含任何 NaN 或 Inf.

原型

tf.verify_tensor_all_finite(
    t,
    msg,
    name=None
)

参数:

  • t:需要检查的张量.
  • msg:登录失败的消息.
  • name:此操作的名称(可选).

返回值:

  • tf.verify_tensor_all_finite函数返回一些与t相同的张量.

tf.check_numerics

检查 NaN 和 Inf 值的张量.
当运行时,如果张量有任何不是数字(NaN) 或无穷大(Inf) 的值,就会报告一个 InvalidArgument 错误.否则,按原样通过张量.

原型

check_numerics ( 
    tensor, 
    message, 
    name = None
 )

参数

  • tensor:一个张量.必须是下列类型之一:half,float32,float64.
  • message:一个字符串.是错误消息的前缀.
  • name:操作的名称(可选).

返回

  • 返回一个张量,与 tensor 具有相同的类型.

tf.add_check_numerics_ops

该操作将 check_numerics 连接到每个浮点张量.

check_numerics 操作本身被添加到每个 half,float 或 double 张量所在的图中.对于图中的所有 ops,check_numerics 其所有(half,float 或 double)都保证在其任何输出 check_numerics 操作之前运行.

原型

add_check_numerics_ops ()

返回:

根据所添加的所有运算 check_numerics 的操作的一组操作.

tf.Assert

Assert

tf.Print

打印张量列表.
这是一个在计算时打印 data 的带有副作用的身份 op.

注意:此操作打印到标准错误.它目前不兼容 jupyter 笔记本(打印到笔记本服务器的输出,而不是笔记本).

原型

Print(
   input_,
   data,
   message=None,
   first_n=None,
   summarize=None,
   name=None
)

参数

  • input_:通过这个操作的张量.
  • data:计算 op 时要打印的张量列表.
  • message:一个字符串,错误消息的前缀.
  • first_n:只记录 first_n 次数.负数日志,这是默认的.
  • summarize:只打印每个张量的许多条目.如果没有,则每个输入张量最多打印3个元素.
  • name:操作的名称(可选).

返回

  • 该操作将返回与 input_ 相同的张量.

你可能感兴趣的:(机器学习,tensorflow)