TensorFlow 中的条件执行
Conditional execution in TensorFlow
如何根据条件选择执行图表的一部分?
我有一部分网络只有在 feed_dict
中提供占位符值时才会执行。如果未提供该值,则采用备用路径。我该如何使用 tensorflow 来实现它?
以下是我的代码的相关部分:
sess.run(accuracy, feed_dict={inputs: mnist.test.images, outputs: mnist.test.labels})
N = tf.shape(outputs)
cost = 0
if N > 0:
y_N = tf.slice(h_c, [0, 0], N)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y_N, outputs, name='xentropy')
cost = tf.reduce_mean(cross_entropy, name='xentropy_mean')
在上面的代码中,我正在寻找可以代替 if N > 0:
的东西
这是一个简单的示例,可以帮助您入门。它根据张量的形状执行图形的不同部分:
import tensorflow as tf
a = tf.Variable([[3.0, 3.0], [3.0, 3.0]])
b = tf.Variable([[1.0, 1.0], [2.0, 2.0]])
l = tf.shape(a)
add_op, sub_op = tf.add(a, b), tf.sub(a, b)
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
t = sess.run(l)
print sess.run(sub_op if t[0] == 3 else add_op)
sess.close()
把3改成2,看看tensor怎么减去。如您所见,我启动了 add
、sub
和 shape
的节点,然后在图表中检查形状并转到 运行 特定部分。
嗯。有可能你想要的是 tf.control_flow_ops.cond()
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/control_flow_ops.py#L597
但这并没有导出到 tf 命名空间中,我在回答时没有检查这个接口的保证稳定性如何,但它在已发布的模型中使用,所以去吧。 :)
但是:因为您在构建 feed_dict 时实际上事先知道您想要的路径,您还可以采用不同的方法在模型中调用单独的路径。执行此操作的标准方法是,例如,设置如下代码:
def model(input, n_greater_than):
... cleverness ...
if n_greater_than:
... other cleverness...
return tf.reduce_mean(input)
out1 = model(input, True)
out2 = model(input, False)
然后根据您知道的内容拉出 out1 或 out2 节点 运行 您的计算并设置 feed_dict。请记住,默认情况下,如果模型引用相同的变量(在 model() 函数 外部 创建它们),那么您基本上会有两条单独的路径。
您可以在卷积 mnist 示例中看到这样的示例:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/mnist/convolutional.py#L165
如果可以的话,我喜欢在不引入控制流依赖的情况下这样做。
如何根据条件选择执行图表的一部分?
我有一部分网络只有在 feed_dict
中提供占位符值时才会执行。如果未提供该值,则采用备用路径。我该如何使用 tensorflow 来实现它?
以下是我的代码的相关部分:
sess.run(accuracy, feed_dict={inputs: mnist.test.images, outputs: mnist.test.labels})
N = tf.shape(outputs)
cost = 0
if N > 0:
y_N = tf.slice(h_c, [0, 0], N)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y_N, outputs, name='xentropy')
cost = tf.reduce_mean(cross_entropy, name='xentropy_mean')
在上面的代码中,我正在寻找可以代替 if N > 0:
这是一个简单的示例,可以帮助您入门。它根据张量的形状执行图形的不同部分:
import tensorflow as tf
a = tf.Variable([[3.0, 3.0], [3.0, 3.0]])
b = tf.Variable([[1.0, 1.0], [2.0, 2.0]])
l = tf.shape(a)
add_op, sub_op = tf.add(a, b), tf.sub(a, b)
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
t = sess.run(l)
print sess.run(sub_op if t[0] == 3 else add_op)
sess.close()
把3改成2,看看tensor怎么减去。如您所见,我启动了 add
、sub
和 shape
的节点,然后在图表中检查形状并转到 运行 特定部分。
嗯。有可能你想要的是 tf.control_flow_ops.cond() https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/control_flow_ops.py#L597
但这并没有导出到 tf 命名空间中,我在回答时没有检查这个接口的保证稳定性如何,但它在已发布的模型中使用,所以去吧。 :)
但是:因为您在构建 feed_dict 时实际上事先知道您想要的路径,您还可以采用不同的方法在模型中调用单独的路径。执行此操作的标准方法是,例如,设置如下代码:
def model(input, n_greater_than):
... cleverness ...
if n_greater_than:
... other cleverness...
return tf.reduce_mean(input)
out1 = model(input, True)
out2 = model(input, False)
然后根据您知道的内容拉出 out1 或 out2 节点 运行 您的计算并设置 feed_dict。请记住,默认情况下,如果模型引用相同的变量(在 model() 函数 外部 创建它们),那么您基本上会有两条单独的路径。
您可以在卷积 mnist 示例中看到这样的示例:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/mnist/convolutional.py#L165
如果可以的话,我喜欢在不引入控制流依赖的情况下这样做。