如何在多分类任务中使用TensorFlow Accuracy指标?为何计算结果不符?
TensorFlow准确率计算异常原因及解决方法
问题原因
你用的tf.keras.metrics.Accuracy()是逐元素对比计算准确率,不是按样本(整行)判断对错。你的数据是3行4列,总共12个元素:
- 第1行:4个元素全匹配
- 第2行:4个元素全匹配
- 第3行:仅最后2个元素匹配
总正确元素数是10,10/12≈0.8333334,这就是你得到的结果。
而你预期的2/3是样本级准确率(每个样本整体预测正确才算1个对),这需要用专门的分类准确率指标。
解决方法
因为你的标签是独热编码格式,应该使用tf.keras.metrics.CategoricalAccuracy(),它会先对预测值取argmax得到类别,再和真实标签的类别对比,按样本计算准确率:
import tensorflow as tf import numpy as np m = tf.keras.metrics.CategoricalAccuracy() y_true = np.array([ [0,1,0,0], [1,0,0,0], [0,1,0,0], ]) y_pred = np.array([ [0,1,0,0], [1,0,0,0], [1,0,0,0], ]) m.update_state(y_true, y_pred) print(m.result().numpy()) # 输出0.6666667,即2/3
两种指标的区别
tf.keras.metrics.Accuracy():逐元素比较,适用于单标签的标量真实值和预测值(比如每个样本是一个数字标签)。tf.keras.metrics.CategoricalAccuracy():针对独热编码的标签,先将预测值转换为类别(取概率最大的索引),再和真实标签的类别对比,按样本计数准确率。
内容的提问来源于stack exchange,提问作者Jason Rich Darmawan
相关产品推荐
相关产品推荐

