【问题标题】:How to control assignments order in Tensorflow?如何控制 Tensorflow 中的分配顺序?
【发布时间】:2017-10-11 10:26:41
【问题描述】:

我已经在 Tensowrflow 图中实现了一些张量初始化作为分配网络。同时,这些赋值应该以正确的顺序调用,因为它们使用了另一个的结果。如果我将分配节点暴露给外部,用户(我自己也是)应该使用会话调用来运行它们

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

按正确顺序排列,可能会出错。我可以将分配序列加入单个操作并仅公开它运行吗?

更新

我写了这段代码,发现它打印眼睛?为什么?它应该打印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。为什么?如何强制下单?

【问题讨论】:

    标签: python tensorflow variable-assignment


    【解决方案1】:

    单个sess.run 调用中的变量顺序没有任何意义。

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

    相当于

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

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

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

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

    因此:-> 首先解析a

    【讨论】:

    • 好的,那么如何控制订单呢? tf.group 中的顺序重要吗?
    • 另外我不明白它是如何暗示c 依赖于b
    • c 依赖于b,因为您将b 的值分配给c。但是b 依赖于a,因为您将a 的值分配给b。因此,决议序列首先强制评估a,然后是依赖它的任何其他操作。当节点之间存在依赖关系时,您不能强制执行任何其他操作。时期。相反,如果不存在依赖项,您可以使用 tf.control_dependencies。如果你真的想“打破”依赖关系,你必须按照你想要的顺序使用 不同 sess.run 单个节点执行。
    • 那么,Tensorflow 中的分配最好被视为不是实际的值分配,而是分配参考或重新连接图形?
    • 没错,你在节点之间画了一条线,这条线是一个强制顺序的关系
    【解决方案2】:

    您可以使用tf.group 对运算符进行分组。如果有任何依赖项,Tensorflow 将为您解决所有依赖项。

    更新

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

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

    更新 2 如果您需要保持 3 个独立张量或运算符的执行顺序,您可以使用 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()
    

    【讨论】:

    • 请看我的更新。我自己遇到了group,但在我测试没有它的示例并发现它以某种方式工作之前。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2010-10-19
    相关资源
    最近更新 更多