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

Kaggle图像分类项目:Keras数据增强报错及精度提升咨询

解决Data Augmentation的报错问题

你碰到的ValueError: Input to .fit() should have rank 4其实是个小疏忽——在plot函数里,你传给data_generator.fit()的是原始的df_training(形状是(28709, 2305),也就是2D的特征矩阵),但ImageDataGenerator.fit()需要的是4D的图像数组,也就是你已经处理好的x_train。

修正后的代码

把plot函数里的输入换成已经reshape好的x_train,同时调整flow的参数,另外给灰度图加上cmap='gray'显示更准确:

from tensorflow.keras.preprocessing.image import ImageDataGenerator
from matplotlib.pyplot import imread, imshow, subplots, show

def plot(data_generator, x_train):
    """ Plots 4 images generated by an object of the ImageDataGenerator class. """
    data_generator.fit(x_train)  # 这里传入处理好的4D图像数组
    image_iterator = data_generator.flow(x_train)
    # Plot the images given by the iterator
    fig, rows = subplots(nrows=1, ncols=4, figsize=(18,18))
    for row in rows:
        row.imshow(image_iterator.next()[0].astype('int'), cmap='gray')
        row.axis('off')
    show()

# 你的数据处理部分保持不变
x_train = df_training.drop("emotion",axis=1)
x_train = x_train.values.reshape(x_train.shape[0], 48, 48,1)
x_train = x_train.astype("float32")

print(x_train.shape)  # 确认输出(28709, 48, 48, 1)
data_generator = ImageDataGenerator(rotation_range=90)
plot(data_generator, x_train)  # 把x_train作为参数传入

这样就能正常运行数据增强的可视化了,因为fit()和flow()都接收到了符合要求的4D灰度图像数组。


提升表情分类模型精度的其他实用方法

针对你当前CNN过拟合、验证精度仅53%的情况,除了数据增强,还有这些针对性的优化方向:

1. 优化数据增强策略

你现在只用了旋转,表情分类可以用更贴合场景的增强方式,避免无效操作:

  • 随机水平翻转:horizontal_flip=True(表情左右翻转不影响类别判断)
  • 随机小幅度平移:width_shift_range=0.1, height_shift_range=0.1
  • 随机缩放:zoom_range=0.1
  • 亮度微调:brightness_range=[0.8,1.2]
  • 注意:不要用垂直翻转,表情垂直翻转后会失去语义,反而干扰模型学习

2. 给模型加“防过拟合buff”

  • 添加Dropout层:在卷积层或全连接层后加入Dropout(0.2-0.5),随机丢弃部分神经元,减少冗余特征依赖
  • 加入L2正则化:给卷积层和全连接层添加kernel_regularizer=tf.keras.regularizers.L2(0.001),限制参数的大小
  • 插入BatchNormalization()层:加速训练收敛,同时稳定模型输出,降低过拟合风险

3. 迁移学习快速提分

因为你只用了4类样本,属于小样本场景,迁移学习能快速提升模型性能:

  • 选用轻量级预训练模型(比如MobileNetV2、ResNet50),去掉顶层全连接层,替换成适配你4类的分类头
  • 注意你的图像是灰度图,需要把单通道转成3通道:x_train = tf.repeat(x_train, 3, axis=-1),适配预训练模型的输入要求

4. 处理样本不平衡问题

即使是数量最多的4类,也可能存在样本分布不均的情况:

  • 使用加权损失函数:训练时传入class_weight参数,给样本量少的类别更高的权重
  • 对样本少的类别做过采样,或者对样本过多的类别做欠采样,平衡各类别的数据量

5. 调整模型结构与训练策略

  • 简化模型:如果当前CNN层数太多、参数冗余,容易过拟合,可以减少卷积层数量或缩小卷积核尺寸
  • 早停与学习率衰减:加入EarlyStopping(patience=5, restore_best_weights=True),防止模型后期过拟合;用ReduceLROnPlateau回调,当验证精度停滞时自动降低学习率
  • K折交叉验证:用多折交叉验证评估模型性能,避免单次数据划分带来的误差,更准确地反映模型泛化能力

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:37:43