如何在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
相关产品推荐
相关产品推荐

