如何使用张量流的功能合并和切换?

gau*_*clb 6 machine-learning control-flow tensorflow

mergeswitch可能不开放使用一般用户。并且我搜索了源代码:

在中有一个描述merge

返回的可用元素的值inputs

可用意味着什么?归还switch吗?这是一个演示:

from tensorflow.python.ops import control_flow_ops

x_0, x_1 = control_flow_ops.switch(tf.constant(2), False)
x_2, x_3 = control_flow_ops.switch(tf.constant(7), True)
y = control_flow_ops.merge([x_0, x_1, x_2, x_3])
with tf.Session() as sess:
    print(sess.run(y))
Run Code Online (Sandbox Code Playgroud)

Max*_*xim 6

switch

让我们从检查control_flow_ops.switch功能开始:

x_0, x_1 = control_flow_ops.switch(tf.constant(2), False)
x_2, x_3 = control_flow_ops.switch(tf.constant(7), True)
with tf.Session() as sess:
  print(sess.run(x_0))    # prints 2
  print(sess.run(x_3))    # prints 7
Run Code Online (Sandbox Code Playgroud)

control_flow_ops.switch返回一个张量元组,但其中只有一个将具有值(取决于条件参数)。在上面的示例中,它x_0 = 2来自第一个switchx_3 = 7第二个。尝试评估x_1x_2将导致Retval的尝试没有值错误:

  sess.run(x_1)  # FAILS!
  sess.run(x_2)  # FAILS!
Run Code Online (Sandbox Code Playgroud)

换句话说,x_0并且x_3可用的,同时x_1还是x_2不是。

merge

control_flow_ops.merge执行逆运算:给定张量元组,它选择可用的张量。精确地,它返回["output", "value_index"]具有值的张量的命名元组。根据当前文档,输入应仅包含一个可用的张量,这意味着您的演示严格来说不受支持,并导致不确定的行为。这是一个例子:

with tf.Session() as sess:
  print(sess.run(merge([x_0, x_1])))       # Merge(output=2, value_index=0)
  print(sess.run(merge([x_1, x_0])))       # Merge(output=2, value_index=1)
  print(sess.run(merge([x_2, x_3])))       # Merge(output=7, value_index=1)
  print(sess.run(merge([x_3, x_2])))       # Merge(output=7, value_index=0)
  print(sess.run(merge([x_0, x_1, x_2])))  # Merge(output=2, value_index=0)
  print(sess.run(merge([x_1, x_2, x_3])))  # Merge(output=7, value_index=2)
Run Code Online (Sandbox Code Playgroud)

这两个函数都可以方便地控制计算流程,例如,control_flow_ops.switch通过switch自身实现梯度(量流源代码)。