Keras搭建融合Conv和LSTM的模型时添加LSTM层报错如何解决
报错根因
Conv2D层输出为4维张量,形状为(batch_size, 特征图高度, 特征图宽度, 通道数),也就是报错里提到的(None, 26, 26, 32);而LSTM层要求输入为3维张量,格式为(batch_size, 时间步长, 特征维度),二者维度不匹配导致报错。
修正方案
需要在卷积层与LSTM层之间新增维度调整层,同时修正输出层前的维度适配问题,具体调整如下:
- 新增
Reshape层将卷积输出的4维张量转换为符合LSTM要求的3维张量,此处我们将特征图的每一行作为一个时间步,将每行像素与通道的拼接结果作为该时间步的特征 - 最后一层LSTM关闭
return_sequences=True参数,避免输出3维张量无法直接接入全连接分类层 - 修正原代码中
compile行多余的右括号语法错误
修正后的完整模型代码
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, LSTM, Dropout, Dense, Reshape model4 = Sequential([ Conv2D(filters=32, kernel_size=3, activation='relu', input_shape=img_shape), # 新增Reshape层调整维度:将(None,26,26,32)转为(None,26, 26*32) Reshape((26, 26*32)), LSTM(32, activation='relu', return_sequences=True), # 最后一层LSTM关闭return_sequences,输出为(None,32) LSTM(32, activation='relu'), Dropout(0.25), Dense(10, activation='softmax') ]) # 修正原代码多余右括号的语法错误 model4.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) model4.fit( x_train, y_train_binary, batch_size=batch_size, epochs=10, verbose=1, validation_data=(x_val, y_val_binary) )
可选优化方向
- 可在卷积层后新增
MaxPooling2D层降维,减少LSTM的计算量 - 可根据效果调整LSTM的隐藏层维度,或叠加更多LSTM层(仅最后一层关闭return_sequences即可)
- 可替换激活函数为
tanh(LSTM默认激活函数,通常训练收敛速度比relu更稳定)
内容的提问来源于stack exchange,提问作者eneko valero
相关产品推荐
相关产品推荐

