如何在Tensorflow中控制作业顺序?

时间:2017-10-11 10:26:42

标签: python tensorflow variable-assignment

我在Tensowrflow图中实现了一些张量初始化作为assigmnets。同时,这些任务应该按正确的顺序调用,因为它们使用其他人的结果。如果我将赋值节点暴露给外部,用户(我也是)应该使用会话调用

运行它们
sess.run([assign1, assign2, ...])

在正确的orded中可能会出错。我可以将分配序列加入到单个操作中并仅显示它运行吗?

更新

我写了这段代码并发现它打印眼睛?为什么?它应该打印b的随机内容,不应该吗?

import tensorflow as tf

tf.reset_default_graph()

a = tf.eye(2, 2)
b = tf.get_variable("b", shape=(2,2))
c = tf.get_variable("c", shape=(2,2))

assign_c = tf.assign(c, b)
assign_b = tf.assign(b, a)

with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())

    sess.run([assign_c, assign_b])

    print(c.eval())

更新2

以下代码显示我无法使用group控制分配顺序:

import tensorflow as tf

tf.reset_default_graph()

a = tf.eye(2, 2)
b = tf.get_variable("b", shape=(2,2), initializer=tf.zeros_initializer)
c = tf.get_variable("c", shape=(2,2))

assign_c = tf.assign(c, b)
assign_b = tf.assign(b, a)

incorrect_init = tf.group(assign_b, assign_c)
correct_init = tf.group(assign_c, assign_b)

with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())

    sess.run([incorrect_init])
    #sess.run([correct_init])

    print(c.eval())

结果总是

[[ 1.  0.]
 [ 0.  1.]]

无论我拨打correct_init还是incorrect_init。为什么?如何强制下单?

2 个答案:

答案 0 :(得分:1)

您可以使用tf.group对运营商进行分组。如果存在任何依赖关系,Tensorflow将解决所有依赖关系。

<强>更新

c <- assign_c =>
c <- b =>
c <- assign_b =>
c <- a

即使您省略了sess.run([assign_c, assign_b])步骤。

更新2 如果您需要保留3个独立的Tensors或Operators的执行顺序,您可以使用control_dependencies执行此操作,但仅限于没有任何依赖项。

with tf.control_dependencies([first]):
    op1 = tf.no_op()
with tf.control_dependencies([op1, second]):
    op2 = tf.no_op()
with tf.control_dependencies([op2, third]):
    op3 = tf.no_op()

with tf.Session() as s:
    op3.aval()

答案 1 :(得分:1)

单个sess.run电话中变量的顺序并不代表任何内容。

sess.run([assign1, assign2, ...])

相当于

sess.run([..., assign2, assign1, ...])

真正重要的是您正在执行的节点之间的关系。

在您的示例中,c.eval()的输出是眼睛,因为:

  1. sess.run([assign_c,assign_b])调用assign_cassign_b
  2. assign_b取决于a
  3. assign_c取决于b
  4. 因此c取决于取决于b
  5. a

    因此: - &gt;首先解决a