4

这个图是如何无环的?assign add op 将 x 添加到自身。

import tensorflow as tf
sess = tf.Session()
x = tf.Variable(1300,name="x")
y = tf.Variable(200, name="y")
z = tf.add(x, y,name="z")
b = x.assign_add(z)
init = tf.initialize_all_variables()
writer = tf.train.SummaryWriter("/tmp/logdir", sess.graph)
sess.run(init)
print(sess.run(b))

用于计算的 TensorBoard Graph

显然,AssignAdd 和 X 之间存在双向边。

为什么 X 被两次描绘为变量?

4

2 回答 2

4

正如Olivier 指出的那样,您的程序的图表是一个 DAG。图形可视化器在渲染图形时采取了一些自由,以使其更易于理解。特别是,运行时本身没有“双向”边,而是 TensorFlow 包含变量的“引用边”,这就像将可变值(如指针或可变引用)传递给 C/C++ 函数,如它们允许接收者修改用于变量的相同底层存储。

请注意,TensorFlow 图包含一个或多个循环,甚至嵌套循环合法的。该函数提供了一种创建结构化循环来表示迭代计算的方法,TensorFlow 可以为此计算梯度。但是,如果您使用简单的变量,则不需要循环。tf.while_loop()

于 2016-06-01T15:50:49.787 回答
3

显然,AssignAdd 和 X 之间存在双向边。

每个操作AssignorAssignAdd有两个输入,没有输出:

  • a tf.Variable:我们为其赋值的变量。在这里您可以看到双向边缘,因为该操作从中读取旧值x,然后写回新值
  • a tf.Tensor:分配给变量的值(或添加到变量中)

为什么 X 被两次描绘为变量?

该变量在名为 的大块中的图中x出现一次X,但使用了两次

  • 在操作中tf.add(x, y):图形读取 的值x作为输入
  • 在AssignAdd 操作中:如前所述,x是AssignAdd 操作的tf.Variable输入。

结论

该图是非循环的,因为每个想要更新 的值的操作x都将变量x作为输入,而不是输出。如果操作Assign有一个变量作为输出,它确实会导致循环。

于 2016-06-01T15:24:13.113 回答