tf.control_dependencies确实可以在我的小程序中工作吗?

时间:2019-03-14 08:23:29

标签: python tensorflow deep-learning artificial-intelligence

我编写了一个samll程序来测试if (empty($_POST['firstname'])) {的工作方式,但是结果似乎让我感到困惑。我的测试代码如下:

tf.control_dependencies

当我运行程序时,import tensorflow as tf x = tf.Variable(0.0) y = None for i in range(5): assign_op = tf.assign(x, i) with tf.control_dependencies([assign_op]): y = tf.identity(x) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print(sess.run(x)) print(sess.run(y)) x的值分别为y0.0。由于4.0的值可获得正确答案,因此在此示例中,y中的assign_op有效。然后,当op正常工作时,为什么tf.control_dependencies的值不等于x
如果我对4.0的实际运作方式有误解,请纠正我。

2 个答案:

答案 0 :(得分:1)

因为直到运行y为止,都没有分配。

您必须将程序视为计算图。通过设置依赖关系,您可以告诉Tensorflow“当您评估y时,请确保分配已经执行”。

但是您在第一次运行x时会告诉您任何操作。

尝试在sess.run(x)之后运行sess.run(y),您会看到预期的结果。

Simplified version of the graph

在图像中,您必须将水平线视为类似于“ join”控制操作:在评估节点之前等待所有“ below”操作”。

答案 1 :(得分:1)

这是因为您尚未执行assign_op操作。这就是您想要的:

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(assign_op)
    print(sess.run(x))
    print(sess.run(y))
# 4.0
# 4.0

但是您要先调用sess.run(x),然后它将其评估为初始值0.0。如果您首先调用sess.run(y),它将首先执行x的赋值,然后将y评估为与x相同的值:

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(y))
    print(sess.run(x))
# 4.0
# 4.0

因此,您需要先致电sess.run(y)