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

基于CNN的洪水易发性二分类模型精度无法提升求助

洪水易发性二分类模型精度瓶颈排查与优化方案请求

我正在开展洪水易发性制图项目,采用淹没/未淹没二分类任务,输入数据尺寸为35×35×16,其中16个通道为洪水预测特征。已搭建基于LeNet的CNN模型,但训练精度始终无法突破0.52,验证精度维持在0.46;调整图像尺寸、滤波器数量/大小、全连接层单元数后仍无改善。附上模型代码及训练曲线截图,请求协助排查问题并提供精度提升方案。

模型代码

NAME = "LeNet"

model = Sequential()
#Layer 1
#Conv Layer 1
model.add(Conv2D(filters = 4, 
                 kernel_size = 3, 
                 strides = 1, 
                 activation = 'relu', 
                 input_shape = (35,35,16)))
#Pooling layer 1
model.add(MaxPooling2D(pool_size = 2, strides = 1))

#add a droupout
model.add(Dropout(0.4))

#Layer 2
#Conv Layer 2
model.add(Conv2D(filters = 8, 
                 kernel_size = 3,
                 strides = 1,
                 activation = 'relu',
                 input_shape = (32,32,4)))
#Pooling Layer 2
model.add(MaxPooling2D(pool_size = 2, strides = 1))

#add a droupout
model.add(Dropout(0.4))

#Layer 3
#Conv Layer 3
model.add(Conv2D(filters = 16, 
                 kernel_size = 3,
                 strides = 1,
                 activation = 'relu',
                 input_shape = (24,24,8)))
#Pooling Layer 3
model.add(MaxPooling2D(pool_size = 2, strides = 1))

#add a droupout
model.add(Dropout(0.4))


#Flatten
model.add(Flatten())


#Layer 3
#Fully connected layer 1
model.add(Dense(units = 100, activation = 'relu'))

#add a droupout
model.add(Dropout(0.4))


#Layer 4
#Fully connected layer 2
model.add(Dense(units = 64, activation = 'relu'))
model.add(Dropout(0.4))



#Layer 5
#Output Layer
model.add(Dense(units = 1, activation = 'sigmoid'))

from keras.callbacks import ModelCheckpoint, EarlyStopping
checkpoint = ModelCheckpoint("LeNet.h5", monitor='val_loss', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)
early = EarlyStopping(monitor='val_loss', min_delta=0, patience=20, verbose=1, mode='auto')

tensorboard = TensorBoard(log_dir="logs/{}".format(NAME))

model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])


model.summary()

训练曲线

训练曲线


问题排查方向

  • 数据层面

    • 检查数据集类别分布:若淹没/未淹没样本比例极端失衡,模型会倾向于预测多数类,导致精度卡在随机水平。可通过混淆矩阵验证,若某一类预测准确率接近100%、另一类接近0,说明类别不平衡。
    • 特征有效性:确认16个通道特征是否与洪水易发性强相关,是否存在无关特征;同时检查特征是否做过归一化/标准化,未统一尺度的特征会导致模型训练不稳定。
    • 数据划分合理性:排查训练集/验证集是否存在数据泄露,或验证集样本不具代表性。
  • 模型结构层面

    • 池化层设置冗余:当前MaxPooling2D的strides=1,导致每次池化后特征图尺寸仅小幅缩小,保留过多冗余信息且增加计算量,无法有效提取抽象特征。
    • Dropout过度:全链路0.4比例的Dropout会过度抑制模型拟合能力,尤其在样本量有限的场景下,难以学习到稳定特征。
    • 卷积特征提取能力不足:滤波器数量从4→8→16的配置过低,无法捕捉复杂的空间关联特征。
    • 全连接层冗余:两次全连接层的参数规模过大,易引发过拟合,同时增加训练负担。

精度提升方案

  1. 数据预处理优化

    • 对16个通道特征做标准化(StandardScaler)或归一化(MinMaxScaler),确保各特征尺度一致。
    • 若存在类别不平衡,采用过采样(SMOTE)、欠采样,或在训练时传入class_weight参数赋予少数类更高权重。
    • 增加数据增强:对35×35特征图进行随机翻转、旋转、平移等操作,扩充训练样本提升泛化能力。
  2. 模型结构调整

    • 修改池化层:将所有MaxPooling2D的strides改为与pool_size一致(即2),有效压缩特征图尺寸:
      model.add(MaxPooling2D(pool_size=2, strides=2))
      
    • 调整Dropout策略:仅在全连接层保留Dropout,将比例降至0.2:
      # 移除卷积层后的Dropout
      model.add(Dense(units=100, activation='relu'))
      model.add(Dropout(0.2))
      model.add(Dense(units=64, activation='relu'))
      model.add(Dropout(0.2))
      
    • 提升滤波器数量:增强特征提取能力:
      # 第一层Conv2D
      model.add(Conv2D(filters=8, kernel_size=3, strides=1, activation='relu', input_shape=(35,35,16)))
      # 第二层Conv2D
      model.add(Conv2D(filters=16, kernel_size=3, strides=1, activation='relu'))
      # 第三层Conv2D
      model.add(Conv2D(filters=32, kernel_size=3, strides=1, activation='relu'))
      
    • 替换Flatten为全局平均池化:降低参数规模,减少过拟合风险:
      model.add(GlobalAveragePooling2D())
      
    • 尝试轻量现代CNN结构:比如MobileNetV2、简化版ResNet,这类结构对小样本高维特征适配性更好。
  3. 训练策略优化

    • 调整学习率:将Adam默认学习率从0.001降至0.0001,或添加ReduceLROnPlateau回调实现学习率衰减。
    • 调整早停参数:适当增大EarlyStopping的patience值,确保模型有足够时间收敛。
    • 监控多维度指标:除精度外,增加召回率、F1-score的监控,更准确反映模型在不平衡数据下的性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:32:06