Tensorflow control_dependencies不强制首先运行指定的运算符

时间:2018-05-04 12:57:34

标签: python tensorflow

今天我注意到Tensorflow中有一些奇怪的行为,并且我想在这里要求了解发生了什么。我的问题围绕tf.control_dependencies,而不是让我在with块中定义的运算符之前运行指定的运算符。我在这里问的不是如何计算性能指标(我手动编码),而是我的误解所在。

所以,设置场景。今天,我制作了一些代码来记录CNN培训期间的性能指标,我正在使用tensorflow.metrics模块。但是,此模块中的运算符会累积先前的结果(因此可以为非常大的数据集计算性能指标)。我想记录指标随着时间的推移如何随着网络训练而发展,所以我不想要这种行为。因此,我将这些性能指标节点的创建包装在tf.control_dependencies中,强制(或者我认为)在计算性能指标之前评估tf.local_variables_initialiser。因此,我的代码看起来像这样

import tensorflow as tf
import numpy as np

labels = tf.convert_to_tensor(np.arange(10))
out = tf.convert_to_tensor(np.random.randn(10, 1))

with tf.control_dependencies([tf.local_variables_initializer()]):
    _, precision = tf.metrics.precision(labels, out)

with tf.Session() as sess:
    #sess.run(tf.local_variables_initializer())
    print(sess.run(precision))

但是当我尝试运行上面的代码时,我收到以下错误

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value precision_4/true_positives/count
     [[Node: precision_4/true_positives/AssignAdd = AssignAdd[T=DT_FLOAT, _class=["loc:@precision_4/true_positives/count"], use_locking=false, _device="/job:localhost/replica:0/task:0/device:CPU:0"](precision_4/true_positives/count, precision_4/true_positives/Sum)]]

现在,我在尝试理解metrics模块时多次遇到此错误,原因是我没有正确初始化变量。因此,我测试了这段代码

import tensorflow as tf
import numpy as np

labels = tf.convert_to_tensor(np.arange(10))
out = tf.convert_to_tensor(np.random.randn(10, 1))

with tf.control_dependencies([tf.local_variables_initializer()]):
    _, precision = tf.metrics.precision(labels, out)

with tf.Session() as sess:
    sess.run(tf.local_variables_initializer())
    print(sess.run(precision))
确实有效。

所以我的问题仍然是。为什么在我的第一个代码示例中计算性能指标之前,tf.local_variables_initializer()节点没有运行?

1 个答案:

答案 0 :(得分:0)

这确实很奇怪。我想你需要放置

 _, precision = tf.metrics.precision(labels, out)

之前的<{1}}

control_dependencies

这可以像预期的那样工作,因为import tensorflow as tf import numpy as np labels = tf.convert_to_tensor(np.arange(10)) out = tf.convert_to_tensor(np.random.randn(10, 1)) _, _precision = tf.metrics.precision(labels, out) with tf.control_dependencies([tf.local_variables_initializer()]): # precision = tf.identity(_precision) precision = 1 * _precision with tf.Session() as sess: print(sess.run(precision)) 的局部变量在调用tf.metrics.precision之前确实存在。在您的代码中,tf.local_variables_initializer在节点tf.local_variables_initializer之前执行。因此,precision不能存在,因此不会初始化,因为图表不存在。

使它更奇怪(这似乎是一个错误): 将precision_4/true_positives/count置于precision = 1 * precision的正文中。但control_dependencies没有。

这是TensorFlow中错误的一个很好的选择。