在TensorFlow中将具有副作用的并发计算添加到图节点的正确方法是什么?

时间:2016-06-19 08:37:28

标签: tensorflow

我基本上有一个带有A操作的计算图,如下所示:

     |
     o
     |
     A
     |
     o
     |

我希望在张量流过B(在这种情况下是变量赋值)时调用额外的计算A

      |
      o
     / \
    A   B
     \ /
      o
      |

似乎元组允许这样做,但我想知道这是否是最好的方法:

import tensorflow as tf
sess = tf.Session()
v = tf.Variable(0)
sess.run(tf.initialize_all_variables())
A = tf.constant(1)
A, _ = tf.tuple([A, v.assign(2)])
print(sess.run(A))  # prints 1
print(sess.run(v))  # prints 2

所有这些都在分层计算的上下文中,其中层权重和其他变量在前向激活通过它们时得到更新。另一种方法可能是在fwd_update_ops列表中累积这些更新,最后调用sess.run([fwd_update_ops, bwd_update_ops], feed_dict)。还有其他选择吗?这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

来自@YaroslavBulatov的评论:

您应该使用tf.control_dependencies([...])

例如,要使操作update_op依赖于res = tf.square(A),您可以写:

v = tf.Variable(0, name='v')
A = tf.constant(3, name='A')

update_op = v.assign(2)

with tf.control_dependencies([update_op]):
    res = tf.square(A, name='square')

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    print(sess.run(res))  # prints 9
    print(sess.run(v))  # prints 2, because v got updated

在执行方面,操作tf.square(A)等待,直到执行update_op

       |
       o
       |  
       A   update_op
       |   /
     square
       |