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

如何在TensorFlow的CNN与BiLSTM组合架构中添加Dropout解决过拟合问题

7层CNN+2层BiLSTM网络添加Dropout解决过拟合方案

你现有代码里仅在BiLSTM层配置了循环dropout,卷积层部分未做dropout正则化,这是过拟合的主要诱因之一,具体添加方式如下:

一、Dropout添加位置选择

  • 卷积层部分:优先使用SpatialDropout2D(更适配卷积输出的空间相关性,会随机丢弃整个特征通道,比普通Dropout效果更好),添加在每个卷积层的激活函数之后、池化层之前;网络浅层dropout率设为0.10.2,深层可提升到0.20.3
  • 全连接/输出层部分:在BiLSTM输出之后、最终的Dense层之前添加普通Dropout,率设为0.3~0.5
  • 原有BiLSTM的dropout参数可以保留0.5,也可根据拟合情况微调

二、修改后完整代码

from keras.layers import SpatialDropout2D, Dropout # 需提前导入对应层

# input with shape of height=42 and width=600
inputs = Input(shape=(42,600,1))

# convolution layer with kernel size (3,3)
conv_1 = Conv2D(64, (3,3), activation = 'relu', padding='same')(inputs)
conv_1 = SpatialDropout2D(0.2)(conv_1) # 新增SpatialDropout
# poolig layer with kernel size (2,2)
pool_1 = MaxPool2D(pool_size=(2, 2), strides=2)(conv_1)

conv_2 = Conv2D(128, (3,3), activation = 'relu', padding='same')(pool_1)
conv_2 = SpatialDropout2D(0.2)(conv_2) # 新增SpatialDropout
pool_2 = MaxPool2D(pool_size=(2, 2), strides=2)(conv_2)

conv_3 = Conv2D(256, (3,3), activation = 'relu', padding='same')(pool_2)
conv_3 = SpatialDropout2D(0.25)(conv_3) # 新增SpatialDropout

conv_4 = Conv2D(256, (3,3), activation = 'relu', padding='same')(conv_3)
conv_4 = SpatialDropout2D(0.25)(conv_4) # 新增SpatialDropout
# poolig layer with kernel size (2,1)
pool_4 = MaxPool2D(pool_size=(2, 1))(conv_4)

conv_5 = Conv2D(512, (3,3), activation = 'relu', padding='same')(pool_4)
batch_norm_5 = BatchNormalization()(conv_5)
batch_norm_5 = SpatialDropout2D(0.3)(batch_norm_5) # 新增SpatialDropout

conv_6 = Conv2D(512, (3,3), activation = 'relu', padding='same')(batch_norm_5)
batch_norm_6 = BatchNormalization()(conv_6)
batch_norm_6 = SpatialDropout2D(0.3)(batch_norm_6) # 新增SpatialDropout
pool_6 = MaxPool2D(pool_size=(2, 1))(batch_norm_6)

conv_7 = Conv2D(512, (2,2), activation = 'relu')(pool_6)
conv_7 = Dropout(0.3)(conv_7) # 新增普通Dropout

squeezed = Lambda(lambda x: K.squeeze(x, 1))(conv_7)

# bidirectional LSTM layers with units=128,原有dropout保留
blstm_1 = Bidirectional(LSTM(128, return_sequences=True, dropout = 0.5))(squeezed)
blstm_2 = Bidirectional(LSTM(128, return_sequences=True, dropout = 0.5))(blstm_1)

blstm_2 = Dropout(0.3)(blstm_2) # 新增普通Dropout
outputs = Dense(len(char_list)+1, activation = 'softmax')(blstm_2)

# model to be used at test time
act_model = Model(inputs, outputs)

三、注意事项

  • Dropout率不要设置过高,否则会导致模型欠拟合,建议从低到高逐步调试
  • 可以配合早停(EarlyStopping)、训练数据增强、L2正则化等方式共同使用,进一步缓解过拟合

训练准确率损失曲线参考

准确率损失曲线图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:36:01