Keras手写数字识别模型训练准确率近99%但预测效果极差求助
问题1:输出层神经元数量配置错误
MNIST手写数字只有0-9共10个分类,你输出层设置了20个神经元,和分类目标完全不匹配,模型输出结果本身就不符合预期,把输出层的units参数改成10即可。
问题2:模型严重过拟合
你训练了50个epoch,且只在训练集上评估准确率,此时模型已经把训练集样本完全“背下来”了,没有泛化到新图片的能力:
- 把epoch调整到3-5轮就足够,MNIST数据集非常简单,训练太多轮只会导致过拟合
- 评估模型效果时要运行
model.evaluate(a_test, b_test)看测试集准确率,训练集准确率没有参考价值 - 可以在隐藏层后添加
tf.keras.layers.Dropout(0.2)层,降低过拟合概率
问题3:预测图片没有做归一化处理
你训练阶段对所有训练、测试样本都做了normalize归一化,把像素值压缩到0-1区间,但你自己读取的预测图片只做了反转,没有做和训练阶段一致的归一化操作,输入数据分布和模型训练时的分布完全不同,模型自然识别不准。你需要对读入的img做和训练集一致的归一化处理:
img = tf.keras.utils.normalize(img, axis=1)
额外优化建议
- 加载本地图片后可以先打印像素值、尺寸,确认和MNIST数据集格式完全对齐,比如MNIST是黑背景白数字,确认反转操作后确实符合这个格式
- 训练完可以先拿测试集样本做一次预测,确认模型在测试集上准确率正常后,再用自己的图片测试,排除模型本身的问题
内容的提问来源于stack exchange,提问作者Colorly
相关产品推荐
相关产品推荐

