MNIST手写数字识别模型自测试准确率仅67%,求排查原因
手写数字识别模型自定义图片测试准确率低的原因分析
核心问题:数据分布与预处理流程不匹配
你的模型在MNIST官方测试集表现良好,但自定义图片准确率偏低,主要源于以下几个关键问题:
训练与测试数据分布差异显著
MNIST数据集的图片是标准化的28×28手写数字:黑底白字、数字居中、笔画粗细和位置相对固定。而你用文本生成的数字图片,大概率在字体风格、数字大小、位置偏移、背景/前景配色上和MNIST完全不同,模型从未学习过这类样本的特征,泛化能力自然无法适配。预处理流程不一致
训练阶段你对MNIST数据做了tf.keras.utils.normalize(..., axis=1)归一化,把像素值缩放到0-1区间,但测试自定义图片时,仅做了反转操作,没有执行相同的归一化。输入数据的数值分布和训练时完全不同,模型无法正确提取有效特征。图片尺寸与反转逻辑问题
你读取自定义图片时没有做尺寸调整,如果生成的图片不是28×28,直接输入模型会导致输入形状不匹配(模型输入要求为(28,28)),特征结构完全混乱。另外,反转逻辑可能有误:如果你的文本图片本身就是黑底白字,np.invert会把它变成白底黑字,和训练集的特征完全颠倒。测试样本量过小
仅测试9张图片得出67%的准确率存在偶然性,无法真实反映模型的泛化能力,建议增加不同风格的测试样本数量。
修正方案
针对上述问题,调整测试阶段的代码逻辑,统一预处理流程:
for x in range(1,10): img = cv.imread(f'{x}.png')[:,:,0] # 强制将图片 resize 到28×28,匹配模型输入尺寸 img = cv.resize(img, (28, 28)) # 根据图片实际配色调整反转逻辑:如果是白底黑字则反转,否则跳过 if np.mean(img) > 127: # 白底图片的平均像素值更高 img = np.invert(img) # 执行与训练集完全一致的归一化操作 img = tf.keras.utils.normalize(img, axis=1) img = np.array([img]) prediction = model.predict(img) print(f'guess: {np.argmax(prediction)}') plt.imshow(img[0], cmap=plt.cm.binary) plt.show()
内容的提问来源于stack exchange,提问作者keith
相关产品推荐
相关产品推荐

