CNN猫狗分类val_accuracy80%但混淆矩阵、分类报告准确率仅50%排查
问题根源
你遇到的准确率差异问题和单样本预测逻辑无关,核心错误出在测试集生成器的参数配置上:
- 调用
flow_from_directory构建测试集迭代器时,你没有手动关闭打乱开关,接口默认shuffle=True,每次迭代取batch时会随机打乱测试集样本顺序 - 训练过程中输出的80%验证准确率是准确的:因为训练时迭代器每输出一个batch,会同步返回该batch内样本匹配的真实标签,直接计算的精度不存在顺序错位
- 你后续手动调用
cnn.predict(test_set)做批量预测时,输出的预测结果是按打乱后的样本顺序排列的,但你读取的test_set.classes是按文件目录排序的固定顺序真实标签,两者顺序完全不匹配,用这两个错位的数组计算混淆矩阵、分类报告,结果自然和随机猜测(50%左右准确率)差不多,没有参考价值。
修复方案
- 修改测试集生成器初始化代码,关闭样本打乱,保证预测结果和真实标签顺序一一对应:
test_set = test_datagen.flow_from_directory( '/content/drive/MyDrive/ML Tutorial/CNN/dataset/test_set', target_size=(64, 64), batch_size=32, class_mode='binary', shuffle=False ) - 补充单样本预测的归一化逻辑,和训练预处理规则对齐:你训练时对所有图像做了1/255的像素值缩放,单张预测时也需要做相同处理,否则单样本预测结果会失准:
test_image = image.load_img('/content/drive/MyDrive/ML Tutorial/CNN/dataset/single_prediction/cat_or_dog_1.jpg', target_size=(64, 64)) test_image = image.img_to_array(test_image) test_image = test_image / 255.0 # 新增:和训练时的rescale操作保持一致 test_image = np.expand_dims(test_image, axis = 0)
修改完成后重新运行预测、指标计算代码,得到的测试集准确率会和训练日志显示的80%左右的结果一致。
内容的提问来源于stack exchange,提问作者Aritra Mandal
相关产品推荐
相关产品推荐

