注意:接受 Tensor 参数的函数也可以接受任何接受的内容 tf.convert_to_tensor.
TensorFlow 提供了几个操作和类,您可以使用它们来控制操作的执行并向图中添加条件依赖关系.
identity
将张量组合在一起.
这将创建一个与 tensors 参数具有相同值的张量元组,但是每个张量的值仅在所有张量的值已经被计算之后才返回.
control_inputs 包含此操作完成之前必须完成的其他操作,但其输出未返回.
这可以用作并行计算的“连接”机制:所有参数张量可以并行计算,但 tuple 返回的任何张量返回的值仅在所有并行计算完成后才可用.
另请参阅 tf.group和 tf.control_dependencies.
tf.tuple(
tensors,
name=None,
control_inputs=None
)
创建一个操作,该操作可以对 TensorFlow 的多个操作进行分组.
当这个操作完成后,所有 input 中的所有 ops 都已完成.这个操作没有输出.
另请参见 tuple 和 control_dependencies 获得更多信息.
group(
*inputs,
**kwargs
)
no_op
递增 ‘ref’,直到达到 “limit”.
count_up_to (
ref ,
limit ,
name = None
)
返回一个张量,与 ref 具有相同的类型.
增量前的输入副本.如果没有其他内容的修改输入,则生成的值都将是不同的.
如果断言 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 禁用此行为.
通过调用 true_fn 或 false_fn 返回的张量.如果 callables 返回单一实例列表, 则从列表中提取元素.
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)不执行.
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)
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的形状不变的定义如下:
如果循环变量是SparseTensor,则形状不变量必须是TensorShape([r]),其中r是由稀疏张量表示的稠密张量的秩.这意味着SparseTensor的三个张量的形状是([None],[None,r],[r]).注意:此处不变的形状是SparseTensor.dense_shape属性的形状.它必须是矢量的形状.
如果循环变量是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模型.
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 提供了几种操作,您可以使用它们将逻辑运算符添加到图形中.
logical_and
not
or
xor
TensorFlow 提供了几种操作,可用于将比较运算符添加到图形中.
https://www.tensorflow.org/api_docs/python/tf/equal
返回 (x! = y) 元素的真值.
注意:NotEqual 支持广播.
not_equal(
x,
y,
name=None
)
以元素方式返回(x
less(
x,
y,
name=None
)
less_equal
[greater(https://www.tensorflow.org/api_docs/python/tf/greater)
greater_equal
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复制哪个元素.
TensorFlow 提供了几种可用于验证值并调试图形的操作.
is_finite
is_inf
返回 X 的元素是 NaN 的.NaN 是代表非数字值的特殊值,用于指示某个值不是数字.
is_nan(
x,
name=None
)
numpy 的兼容性相当于 np.isnan
用于断言(assert)张量不包含任何 NaN 或 Inf.
tf.verify_tensor_all_finite(
t,
msg,
name=None
)
检查 NaN 和 Inf 值的张量.
当运行时,如果张量有任何不是数字(NaN) 或无穷大(Inf) 的值,就会报告一个 InvalidArgument 错误.否则,按原样通过张量.
check_numerics (
tensor,
message,
name = None
)
该操作将 check_numerics 连接到每个浮点张量.
check_numerics 操作本身被添加到每个 half,float 或 double 张量所在的图中.对于图中的所有 ops,check_numerics 其所有(half,float 或 double)都保证在其任何输出 check_numerics 操作之前运行.
add_check_numerics_ops ()
根据所添加的所有运算 check_numerics 的操作的一组操作.
Assert
打印张量列表.
这是一个在计算时打印 data 的带有副作用的身份 op.
注意:此操作打印到标准错误.它目前不兼容 jupyter 笔记本(打印到笔记本服务器的输出,而不是笔记本).
Print(
input_,
data,
message=None,
first_n=None,
summarize=None,
name=None
)