You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:15:26