今天我注意到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()
节点没有运行?
答案 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中错误的一个很好的选择。