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

为何我的Keras CNN模型在大数据集下快速陷入局部最小值?

模型训练停滞问题:1个epoch后指标不再变化的原因与改进方案

问题背景

我是机器学习新手,手上有9个类别的35万+标注图像数据集。训练CNN时遇到核心问题:训练1个epoch后,训练准确率、验证损失、验证准确率在后续轮次完全停滞,不再变化。想知道导致模型快速陷入局部最小值的原因,以及可行的改进方案。

数据集划分

  • 训练集:60%
  • 验证集:20%
  • 测试集:20%

训练结果可视化

模型训练结果图

模型与训练代码

IMAGE_SIZE = [225,300]
BATCH_SIZE = 32
NUM_EPOCHS = 10

class_weight = 
              {0: 1588.3125, 1: 457.434, 2: 83.53433162892622, 
               3: 13.31608057755007, 4: 1.9566857729489264, 5: 2.7059415077374473, 
               6: 2.6158218582734802, 7: 1.6870270110788204, 8: 18.367892707998713}

initial_learning_rate = 0.01
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate, decay_steps=20, decay_rate=0.96, staircase=True
)

checkpoint_cb = tf.keras.callbacks.ModelCheckpoint(
    f"model_weights.h5", save_best_only=True
)

early_stopping_cb = tf.keras.callbacks.EarlyStopping(
    patience=10, restore_best_weights=True
)

model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation = tf.nn.relu, input_shape=(*IMAGE_SIZE,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64, (2,2), activation = tf.nn.relu))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128, (2,2), activation = tf.nn.relu))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(256, (2,2), activation = tf.nn.relu))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(512, (2,2), activation = tf.nn.relu))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.2))
model.add(layers.Dense(512, activation = tf.nn.softmax))
model.add(layers.Dense(9))

model.compile(
    optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule), 
    loss = tf.keras.losses.SparseCategoricalCrossentropy(), 
    metrics=['accuracy'])


history = model.fit(
    train_dataset, 
    epochs = NUM_EPOCHS, 
    validation_data=(valid_dataset),
    callbacks=[checkpoint_cb, early_stopping_cb],
    class_weight=class_weight)

模型结构可视化

模型结构图


问题原因分析

  1. 最后两层激活函数与损失函数不匹配
    模型最后一层是Dense(9)无激活函数,搭配SparseCategoricalCrossentropy损失(该损失期望输入是logits),但倒数第二层用了softmax激活。这会导致输出概率分布传入损失时,梯度消失严重——softmax输出接近0或1时,梯度几乎为0,模型无法更新参数,直接陷入停滞。

  2. 学习率设置不合理
    初始学习率设为0.01,对于Adam优化器来说过高(Adam默认初始学习率是0.001)。过高的学习率可能导致模型在第一个epoch就跳过最优区域,直接进入参数无法更新的平坦区域。再加上指数衰减,后续学习率会更小,完全无法推动参数更新。

  3. 类别权重失衡极端
    类别0的权重高达1588,类别7仅1.68,极端的类别权重会让模型在训练初期就过度偏向少数类,导致损失函数快速进入局部最小值,后续无法调整。

  4. 模型结构存在信息丢失
    连续的2x2卷积+2x2池化,多次下采样后,原始图像的特征可能被过度压缩。对于225x300的输入,经过5次池化后,特征图尺寸会变得极小,有效特征丢失严重,模型无法学习到区分不同类别的信息。


改进方案

  1. 修正激活函数与损失函数的匹配
    去掉倒数第二层的softmax激活,让最后一层Dense(9)直接输出logits,与SparseCategoricalCrossentropy(from_logits=True)配合使用:

    model.add(layers.Dense(512, activation = tf.nn.relu))  # 替换原softmax为relu
    model.add(layers.Dense(9))  # 保持无激活
    
    model.compile(
        optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule), 
        loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), 
        metrics=['accuracy'])
    
  2. 调整学习率
    把初始学习率降到0.001(Adam默认值),并调整衰减参数,让每轮epoch衰减一次:

    initial_learning_rate = 0.001
    lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
        initial_learning_rate, decay_steps=len(train_dataset)//BATCH_SIZE, decay_rate=0.9, staircase=True
    )
    
  3. 优化类别权重

    • 对类别权重做上限裁剪,比如把最大权重限制在50以内,防止少数类过度主导损失。
    • 尝试过采样/欠采样:对少数类图像进行复制增强,或对多数类随机采样减少数量,平衡数据集分布,降低对类别权重的依赖。
  4. 调整模型结构

    • 减少池化次数:比如去掉最后1-2次池化,保留更多特征信息。
    • 替换部分2x2卷积为3x3卷积:3x3卷积能提取更丰富的空间特征,且参数量比2x2更高效。
    • 添加批量归一化:在每个Conv2D和Dense层后添加layers.BatchNormalization(),稳定训练过程,缓解梯度消失。
  5. 添加数据增强
    对训练集添加随机翻转、旋转、缩放等操作,增加数据多样性,帮助模型跳出局部最小值:

    data_augmentation = tf.keras.Sequential([
        layers.RandomFlip("horizontal"),
        layers.RandomRotation(0.1),
        layers.RandomZoom(0.1)
    ])
    # 在模型开头添加增强层
    model = models.Sequential()
    model.add(data_augmentation)
    model.add(layers.Conv2D(32, (3,3), activation = tf.nn.relu, input_shape=(*IMAGE_SIZE,3)))
    # ... 后续层不变
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:27:10