基于Keras的CNN模型无法获取准确率及绘制ROC曲线求助
错误原因
- 直接原因:
roc_curve要求输入数组类型的真实标签,你传入的test_set是Keras的DirectoryIterator迭代器对象,不符合输入要求 - 次要问题:你的模型用2类softmax输出,返回的预测结果是形状为(样本数, 2)的概率矩阵,无法直接输入
roc_curve计算,需要提取正类的单维概率
修复方案
1. 提取真实标签与正类预测概率
确保测试集生成器的shuffle参数为默认值False(否则预测结果顺序和标签顺序不匹配),执行以下代码:
import numpy as np from sklearn.metrics import roc_curve, auc, accuracy_score # 提取测试集真实标签数组 y_true = test_set.classes # 提取正类(类别索引为1的类别)预测概率 y_pred_pos = classifier.predict(test_set)[:, 1]
2. 计算ROC曲线与AUC值
# 计算ROC曲线的假阳性率、真阳性率、阈值 fpr, tpr, thresholds = roc_curve(y_true, y_pred_pos) # 计算AUC指标 roc_auc = auc(fpr, tpr)
3. 获取模型准确率
方法一:直接调用模型内置评估方法
# 返回值依次为测试集损失、测试集准确率 test_loss, test_acc = classifier.evaluate(test_set, verbose=0) print(f"测试集准确率:{test_acc:.4f}")
方法二:手动基于预测结果计算
# 把概率转为预测类别 y_pred = np.argmax(classifier.predict(test_set), axis=1) # 计算准确率 acc = accuracy_score(y_true, y_pred) print(f"手动计算测试集准确率:{acc:.4f}")
优化建议
你当前是二分类任务,可以调整模型配置简化后续处理:
- 输出层改为
Dense(units = 1, activation = 'sigmoid') - 损失函数改为
binary_crossentropy - 训练/测试生成器的
class_mode改为'binary'
调整后预测结果直接返回正类概率,无需额外切分维度。
内容的提问来源于stack exchange,提问作者farabee
相关产品推荐
相关产品推荐

