Keras中如何将CNN输出传入LSTM替代全连接网络
修改CNN+LSTM+Dense网络结构方案
核心修改思路
- 保留原有的CNN特征提取部分,移除Flatten层——因为LSTM需要接收序列格式的输入(
(时间步长, 特征数)),扁平化会丢失序列维度信息 - 在CNN输出后添加LSTM层,利用其序列建模能力替代原全连接层
- LSTM输出后接Dropout和最终分类Dense层
修改后的完整代码
inputt = Input(shape=(x_train.shape[1], x_train.shape[2])) # 原CNN特征提取模块不变 output = Conv1D(filters=64, kernel_size=4, activation='relu')(inputt) output = MaxPooling1D(pool_size=4)(output) output = Dropout(0.2)(output) output = Conv1D(filters=64, kernel_size=4, activation='relu')(output) output = MaxPooling1D(pool_size=4)(output) output = Dropout(0.2)(output) # 替换全连接为LSTM层 output = LSTM(64, activation='relu')(output) # units数量可根据需求调整,默认return_sequences=False output = Dropout(0.5)(output) # 最终二分类输出层 output = Dense(2, activation='softmax')(output) model = Model(inputs=inputt, outputs=output) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
关键细节说明
- 输入形状匹配:经过两次Conv1D+MaxPooling1D后,CNN输出形状为
(None, 30, 64)(None对应batch size,30为序列长度,64为特征数),完全符合LSTM的输入格式要求 - LSTM参数调整:如果需要堆叠多层LSTM,需将前一层的
return_sequences设为True,示例如下:output = LSTM(64, activation='relu', return_sequences=True)(output) output = LSTM(32, activation='relu')(output) - 激活函数修正:原代码中中间层使用
softmax不合理,替换为LSTM后仅在最终分类层使用softmax(二分类也可改用sigmoid,需对应调整损失函数为binary_crossentropy)
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

