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

如何使Keras CNN模型对自定义数据集的预测精度接近测试集精度?

问题分析与解决思路

模型在Fashion MNIST测试集精度达标,但自定义图片预测精度暴跌,核心原因是训练数据与自定义数据的分布不一致,加上预处理可能存在误差,以下是具体原因和解决方法:

一、核心原因

1. 数据分布差异

Fashion MNIST的图片是标准化的:黑底白图、物体居中、无复杂背景、尺寸固定28x28。而自行收集的图片可能存在:

  • 背景杂乱(带场景、阴影等)
  • 物体位置偏移、大小不一
  • 亮度/对比度与训练集差异大
  • 颜色反转逻辑和训练集不匹配

2. 预处理流程不一致

你的自定义图片预处理代码存在手动遍历像素的操作,容易出现维度顺序错误:

pixel = im.getpixel((y,x))  # Image.getpixel的参数是(x,y),这里写反会导致图片转置

另外需确认训练时的预处理是否和预测完全一致:比如训练集是否做了255-pixel的颜色反转、归一化是否都是/255.0。

3. 自定义数据集质量问题

  • 标注错误:部分图片的实际类别和预期不符
  • 类别不平衡:某类图片占比过高,导致模型偏向该类
  • 图片模糊、分辨率低:影响模型特征提取

二、解决方法

1. 对齐预处理流程

替换手动像素遍历的代码,用numpy简化处理,避免维度错误:

file_dir = '/Users/yan/Desktop/data/'
for n in os.listdir(file_dir):
    if n.lower().endswith(('.png','.jpg','.jpeg')):
        data_dir = os.path.join(file_dir, n)  # 用os.path.join避免路径拼接错误
        im = Image.open(data_dir).convert('L')
        im = im.resize((28,28), PIL.Image.Resampling.LANCZOS)
        # 转numpy数组处理,更可靠
        img_array = np.array(im)
        # 颜色反转(匹配Fashion MNIST的黑底白图)
        img_array = 255 - img_array
        # 归一化
        img_array = img_array / 255.0
        # 调整维度为(batch, height, width, channel)
        arr1 = img_array.reshape((1,28,28,1))
        
        classes = list(fashion_mnist_labels.values())
        pred_idx = np.argmax(model.predict(arr1, verbose=0))  # 关闭verbose减少输出
        print(f"{n} 预测为:{classes[pred_idx]}")

同时核对训练时的预处理代码,确保每一步(颜色反转、归一化、resize)完全一致。

2. 缩小数据分布差距

  • 可视化对比:随机选几张Fashion MNIST图片和自定义图片,对比亮度、背景、物体位置差异,针对性调整:
    • 若自定义图片有复杂背景,先做背景去除(阈值分割、抠图)
    • 若物体不居中,裁剪或平移图片让物体居中
  • 数据增强:训练时加入数据增强,让模型适应更多形态的图片:
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    datagen = ImageDataGenerator(
        rotation_range=10,
        width_shift_range=0.1,
        height_shift_range=0.1,
        horizontal_flip=True
    )
    datagen.fit(x_train)
    
    对自定义预测图片也可做轻微增强(比如调整亮度),缩小和训练集的差异。

3. 优化模型泛化能力

  • 加入正则化:在CNN层后添加Dropout层,或在Dense层加入L2正则化:
    from tensorflow.keras.layers import Dropout
    from tensorflow.keras.regularizers import l2
    
    # 卷积层后加Dropout
    model.add(Dropout(0.2))
    # Dense层加L2正则化
    model.add(Dense(128, activation='relu', kernel_regularizer=l2(0.001)))
    
  • 微调模型:如果自定义图片数量足够,用训练好的模型在自定义数据集上做微调(冻结部分底层,训练顶层)。

4. 验证自定义数据集

  • 检查所有自定义图片的标注是否正确,统计每个类别的数量,若某类占比过高,补充其他类的图片
  • 收集预测错误的图片,分析错误类型(比如把T恤识别成衬衫),针对性优化预处理或补充对应类别的数据

内容的提问来源于stack exchange,提问作者yannn31

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:48:23