Tensorflow图:Tensorflow图是否为DAG?在张量变量中的assignAdd操作中会发生什么

时间:2016-06-01 14:26:36

标签: graph tensorflow directed-acyclic-graphs tensorboard

这个图表是如何非循环的? 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 for the computation

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

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

2 个答案:

答案 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之间存在双向边缘。

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

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

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

变量x在名为X的大块图表中显示为一次,但使用两次

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

结论

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