tf.metrics.accuracy与实际精度不符

小牛猫鼬

我正在尝试使用TensorFlow(而非Keras)重现Coursera ML课程的NN练习。

我发现使用计算精度tf.metrics.accuracy会得出比计算精度低的结果。

相关代码为:

accuracy, update_op = tf.metrics.accuracy(labels=y, predictions=tf.argmax(tf.sigmoid(output), axis=1))
...
# in session:
acc = sess.run(accuracy, feed_dict={tf_x: X, tf_y: y})
sess.run(update_op, feed_dict={tf_x: X, tf_y: y})
print(f'step {step} - accuracy: {acc}')
...
# real accuracy
predictions = sess.run(tf.argmax(tf.sigmoid(output), axis=1), feed_dict={tf_x: X})
pred_y = predictions == y
print(f'Training Set Accuracy after training: {np.mean(pred_y) * 100}%')

甚至可以相差30%(即acc为0.5,实际精度为0.8)

难道我做错了什么?

请注意,如果我这样做:

equal = tf.equal(tf.cast(tf.argmax(tf.sigmoid(output), 1), tf.int32), y)
acc_op = tf.reduce_mean(tf.cast(equal, tf.float32))
acc = sess.run(acc_op, feed_dict={tf_x: X, tf_y: y})

我得到相同的结果... tf.metrics.accuracy是否以其他方式计算?

霸王龙

解决方案:首先打电话sess.run(update_op, feed_dict),然后sess.run(accuracy)如果要补料一个新批次,并且希望达到该批次的精度则必须首先重置一些隐藏的变量-工作流程如下:

accuracy, update_op = tf.metrics.accuracy(tf_labels, tf_predictions, scope="my_metrics")
running_vars = tf.get_collection(tf.GraphKeys.LOCAL_VARIABLES, scope="my_metrics")
running_vars_initializer = tf.variables_initializer(var_list=running_vars)
for i in range(num_batches):
    # explicitly initialize/reset 'total' and 'count' to 0
    sess.run(running_vars_initializer) 

    # feed labels and predictions at i-th batch to update_ops
    feed_dict={tf_labels: y[i], tf_predictions: tf.argmax(tf.sigmoid(output[i]), axis=1)}
    session.run(update_op, feed_dict=feed_dict)

    # compute and print accuracy from current 'total' and 'count'
    print('Batch {} accuracy: {}'.format(i, session.run(accuracy)))


详细信息 tf.metrics.accuracy 利用两个运行时变量, total (正确预测的数量)和 count (馈送的标签数量),在后台进行本地初始化。 一次 accuracy 更新 一次 -在步骤中: update_op

  • totalcount初始化为零
  • sess.run(update_op, feed_dict)- >totalcount每更新feed_dict
  • sess.run(accuracy)->accuracy使用当前 totalcount来计算度量
  • sess.run(accuracy, feed_dict)->accuracy使用当前 totalcount来计算度量

最后两个说的是,feed_dict实际上什么也没改变accuracyaccuracytotal和上运行count,只能通过进行更新update_op最后,

  • sess.run(accuracy, ...)没有复位totalcount0

这在很大程度上是原因totalcount完全用于可扩展性; 通过保持运行历史记录,它可以一次性计算太大而无法放入内存的数据指标。

最后,您的占位符逻辑看起来很简单-您将数据输入tf_xtf_y,但在其中都找不到tf.metrics.accuracy(...),但是这很容易解决。


参考资料/进一步阅读 StackOverflow ,一个不错的 博客文章

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何正确使用tf.metrics.accuracy?

为什么 'metrics = tf.keras.metrics.Accuracy()' 给出错误但 'metrics=['accuracy']' 不是?

在Keras中使用tf.metrics.mean_per_class_accuracy

从tf.metrics.accuracy返回的第一个值代表什么

在Keras中使用tf.metrics?

sigmoid层的tf.keras.metrics.MeanIoU

当使用metrics = ['accuracy']时,Keras使用什么精度函数?

tf.metrics 的返回值是什么意思?

在tf.metrics.mean_cosine_distance上使用哪个调光?

如何正确使用tf.metrics.recall_at_k?

tf.keras.metrics.SpecificityAtSensitivity num_thresholds解释

如何使用tensorflow tf.metrics.mean_iou?

Tensorflow tf.metrics.mean_iou返回0

使用tf.metrics.auc进行培训和验证

tf.contrib.metrics.f1_score无法导入

tf.metrics.mean_squared_error 的准确性

tf.metrics.auc与sklearn.metrics.roc_auc_score产生很大不同

tf.loss和tf.metrics有什么区别?

Tensorflow:如何在多类分类中使用tf.keras.metrics?

通过eval_metric_ops在Tensorboard中的Tensorflow图tf.metrics.precision_at_thresholds

如何使用tf.metrics计算多标签分类的准确性?

TensorFlow:如何在tf.contrib.metrics.streaming_mean_iou中获得total_cm

tf.contrib.metrics.streaming_auc中的update_op返回值的目的是什么

如何在Tensorflow中正确使用tf.metrics.mean_iou在Tensorboard上显示混淆矩阵?

ValueError:模型未配置为计算精度。您应该将`metrics = [“ accuracy”]`传递给`model.compile()`方法

tf.ExponentialMovingAverage的结果与预期不符

在Tensorflow 2.2中将tf.metrics.MeanIoU()与SparseCategoricalCrossEntropy损失一起使用时,尺寸不匹配错误

tf.keras.metrics.TruePositives()在作为度量传递给model.compile()时在model.fit()中返回错误值

`from tensorflow.keras.metrics import binary_accuracy` 和 `from tensorflow.metrics import binary_accuracy` 有什么区别