EfficientNet B0模型测试集准确率正常但单张图片预测类别错误
问题定位与解决方法
1. 标签映射顺序不匹配(核心诱因)
训练阶段使用LabelEncoder生成标签编码时,编码顺序是按照数据集文件夹名称的字典序自动生成的,和你推理阶段手动定义的标签列表['vehicle', 'army', 'general']没有对应关系,会直接导致预测输出的索引匹配到错误的类别。
验证修复方式:训练完成后打印y_labelencoder.classes_,输出数组的顺序就是编码0、1、2对应的真实类别,将推理阶段的标签列表替换为该输出即可。
2. 训练与推理预处理逻辑不一致
- 训练流程:你先对图像做了
images.astype('float32') / 255.0归一化,又调用preprocess_input做二次数值转换 - 推理流程:仅调用
preprocess_input,没有提前做除以255的操作,导致输入模型的像素数值范围和训练时完全不同,预测结果必然出错。
修复方式:统一预处理逻辑,删除训练阶段自行添加的/ 255.0操作,直接使用EfficientNet自带的预处理函数即可,官方实现已经包含了对应的数值范围转换逻辑。
3. 通道顺序不匹配
cv2默认读取图像为BGR通道顺序,而EfficientNet的预处理逻辑默认针对RGB图像,训练和推理阶段都需要增加通道转换步骤,在cv2.imread之后添加代码img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)即可。
4. 潜在代码笔误
数据集加载部分的循环代码存在变量名错误:for i in dataset_path:循环内写的是data_path = path + str(I),大写I和循环变量小写i不匹配,如果不是粘贴代码时的手误,会导致数据集加载错误,训练数据本身存在标注错位问题。
效果验证步骤
- 修正标签映射列表和预处理逻辑后,先取测试集中的已知标注样本做单图推理,确认预测结果和标注一致后,再测试其他样本。
- 可以打印单图推理的输出概率,确认最高概率对应的标签和真实类别匹配。
内容的提问来源于stack exchange,提问作者Usama Aleem
相关产品推荐
相关产品推荐

