Keras搭建LSTM模型触发输入维度不兼容报错如何排查解决
报错根因
Keras中LSTM层要求输入为3维张量,维度顺序为(批量大小, 时间步长, 单时间步特征数),你在首层定义LSTM时传入的input_shape=(2,1),明确要求单样本输入形状为2个时间步、每个时间步1个特征,即输入整体应为3维。
但你当前传入的trainx形状为(3885, 2),是2维张量,仅包含(样本数, 特征数)两个维度,缺少时间步对应的维度,因此触发维度不匹配报错。
另外你代码中使用了Flatten层但未在导入语句中声明,运行到该层时还会触发NameError;多次运行看到sequential_34、sequential_41这类递增序号,是因为每次运行都在当前计算图中新增了模型实例,未清理旧的模型定义,该现象不影响核心报错逻辑。
修复步骤
- 调整输入数据维度:将2维的输入特征重塑为LSTM要求的3维格式,匹配你设置的
(2,1)输入形状:
trainx = trainx.reshape((trainx.shape[0], 2, 1)) testx = testx.reshape((testx.shape[0], 2, 1))
重塑后trainx.shape将变为(3885, 2, 1),完全符合LSTM层的输入维度要求。
- 补全缺失的导入:在层导入语句中加入
Flatten:
from keras.layers import LSTM, Dense, Flatten
- 适配标签形状:你的输出层为2分类softmax,输出形状为
(批量大小, 2),当前标签为1维整数数组,建议转为one-hot编码匹配输出形状,避免训练时出现标签维度不匹配问题:
from keras.utils import to_categorical trainy = to_categorical(trainy, num_classes=2) testy = to_categorical(testy, num_classes=2)
修正后核心代码
import numpy import tensorflow as tf from keras.models import Sequential from keras.layers import LSTM, Dense, Flatten from keras.layers import Bidirectional from keras.layers import TimeDistributed from sklearn.model_selection import KFold, cross_val_score, train_test_split # 此处省略原有数据加载逻辑 # 维度修正 trainx = trainx.reshape((trainx.shape[0], 2, 1)) testx = testx.reshape((testx.shape[0], 2, 1)) trainy = to_categorical(trainy, num_classes=2) testy = to_categorical(testy, num_classes=2) model = Sequential() model.add(LSTM(40, return_sequences=True, input_shape=(2, 1))) model.add(Dense(20, activation='relu')) model.add(Dense(16, activation='sigmoid')) model.add(Dense(5, activation='tanh')) model.add(Flatten()) model.add(Dense(2, activation='softmax')) model.compile(loss='mean_squared_logarithmic_error', optimizer='adam', metrics=['accuracy']) callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3) model.fit(trainx, trainy, epochs=10, batch_size=10, callbacks=[callback]) model.save_weights('LSTMBasic1.h5')
内容的提问来源于stack exchange,提问作者Shehneel Khan
相关产品推荐
相关产品推荐

