使用tf.metric模块中的变量时TensorFlow FailedPreconditionError

时间:2017-07-07 16:05:31

标签: python tensorflow neural-network conv-neural-network tensorboard

我尝试使用tf.metrics子模块中的函数(例如tf.metrics.accuracy(y_labels, y_predicted)和精确或召回的等效项)为CNN的训练代码添加一些额外的测量值。这与他们的大多数教程相反,他们提出了令人费解的内容:

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

我的实现用以下内容替换了这一行:

accuracy = tf.metrics.accuracy(y_labels, y_predicted)

现在,即使我在sess.run(tf.initialize_all_variables())块中执行with tf.Session() as sess:,但在尝试使用tf.metrics.accuracy函数时仍会出现以下错误:

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value performance/accuracy/count
 [[Node: performance/accuracy/count/read = Identity[T=DT_FLOAT, _class=["loc:@performance/accuracy/count"], _device="/job:localhost/replica:0/task:0/cpu:0"](performance/accuracy/count)]]

最值得注意的是,将accuracy = tf.metrics.accuracy(y_labels, y_predicted)行替换为accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))可以解决问题,但是,我想实现其他指标,如精确度,召回等,而无需手动执行。

2 个答案:

答案 0 :(得分:2)

TL; DR:在会话开始时添加以下行:

sess.run(tf.local_variables_initializer())

混淆源于(作为frankyjuang points out)已弃用的tf.initialize_all_variables()函数的名称。此功能部分被弃用,因为它被错误命名:它实际上并未初始化所有变量,而只是初始化全局(不是本地 )变量。 根据{{​​3}}函数的文档(强调添加):

  

accuracy函数会创建两个本地变量,totalcount,用于计算predictions匹配的频率{{ 1}}。

因此,您需要为局部变量添加显式初始化步骤,可以使用tf.metrics.accuracy()完成,如上所述。

答案 1 :(得分:-1)

sess.run(tf.initialize_all_variables())已被弃用。

使用sess.run(tf.global_variables_initializer())来解决您的问题。

参考

根据tf.initialize_all_variables的文件,

  

此功能已被弃用。它将在2017-03-02之后删除。更新说明:改为使用tf.global_variables_initializer。