重训练InceptionResNetV2后,CIFAR100模型真实准确率计算及分类报告异常排查
CIFAR100模型分类报告异常问题解决与准确率说明
核心问题原因
你遇到的分类报告异常(仅第73类召回率为1,其余为0)+ UndefinedMetricWarning,本质是sklearn分类报告的输入标签格式不匹配:
classification_report要求传入整数形式的真实标签和预测标签,但你大概率传入了独热编码格式的标签,或是预测结果未从概率分布转为整数标签,导致模型预测结果被错误匹配,最终表现为所有样本都被判定为第73类。
分步解决方案
1. 修正标签与预测结果的格式
处理真实标签
如果测试集标签做了独热编码,需要转换回整数形式:
import numpy as np # 假设y_test是独热编码后的测试集标签,shape为(样本数, 100) y_test_true = np.argmax(y_test, axis=1)
处理预测结果
模型predict输出的是每个样本的类别概率分布,需转为整数标签:
# x_test_scaled是缩放至75×75的测试集数据 y_pred_proba = model.predict(x_test_scaled) # 取概率最大的类别作为预测结果 y_pred = np.argmax(y_pred_proba, axis=1)
重新生成分类报告
from sklearn.metrics import classification_report print(classification_report(y_test_true, y_pred))
2. 验证独热编码的正确性
训练和测试阶段的独热编码必须保持一致,确保类别数设置为100:
from tensorflow.keras.utils import to_categorical # 训练集标签转独热编码 y_train_onehot = to_categorical(y_train, num_classes=100) # 测试集标签转独热编码,必须和训练集用相同的num_classes y_test_onehot = to_categorical(y_test, num_classes=100)
3. 消除UndefinedMetricWarning
该警告是因为部分类别没有被模型预测到(分母为0无法计算指标),修正标签格式后,只要模型确实预测了多个类别,警告会自动消失。
真实准确率的计算方式
Keras evaluate返回的准确率
model.evaluate()返回的是全局准确率,计算逻辑为:
全局准确率 = 正确预测的样本总数 / 测试集样本总数
与sklearn准确率的一致性
你可以用sklearn手动验证,结果会和evaluate返回的0.7148完全一致:
from sklearn.metrics import accuracy_score acc = accuracy_score(y_test_true, y_pred) print(f"手动计算全局准确率:{acc:.4f}")
分类报告中的accuracy字段就是这个全局准确率,而宏平均(macro avg)、加权平均(weighted avg)是对每个类别的精确率、召回率做不同方式的平均,用于评估模型在不均衡数据集上的表现,全局准确率是最直接的整体性能指标。
内容的提问来源于stack exchange,提问作者GSandro_Strongs
相关产品推荐
相关产品推荐

