这个图表是如何非循环的? 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))
显然,AssignAdd和X之间存在双向边缘。
为什么X被描述为变量两次?
答案 0 :(得分:4)
作为Olivier points out,您的计划的图表是DAG。图形可视化工具在渲染图形时更加容易理解。特别是,运行时本身没有“双向”边缘,而是TensorFlow包含变量的“参考边”,就像将可变值(如指针或可变引用)传递给C / C ++函数一样,它们允许收件人修改用于变量的相同底层存储。
请注意 合法TensorFlow graphs to contain one or more cycles,甚至是嵌套周期。 tf.while_loop()
函数提供了一种创建结构化循环以表示迭代计算的方法,TensorFlow可以为其计算梯度。但是,对于使用简单变量,您不需要循环。
答案 1 :(得分:3)
显然,AssignAdd和X之间存在双向边缘。
每个操作Assign
或AssignAdd
都有两个输入,没有输出:
tf.Variable
:我们为其分配值的变量。在这里,您可以看到双向边,因为该操作从x
读取旧值,然后写回新值tf.Tensor
:分配给变量的值(或添加到变量中)为什么X被描述为变量两次?
变量x
在名为X
的大块图表中显示为一次,但使用两次:
tf.add(x, y)
中的x
的值作为输入x
是AssignAdd操作的tf.Variable
输入。图表为非循环,因为每个想要更新x
值的操作都将变量x
作为输入,但不输出。如果操作Assign
有一个变量作为输出,它确实会导致循环。