LSTM模型拟合报错:输入维度不兼容问题求助
问题分析
错误的核心是LSTM层要求输入为3维张量,格式为(样本数, 时间步长度, 特征数),但你的x_train是2维的(2134,8),缺少了时间步/特征维度,导致输入不匹配。
另外你的模型还存在一个隐藏问题:最后一层Dense(32)的输出维度和y_train的5维分类标签不匹配,即使解决输入问题后,后续拟合也会报错。
解决方案
1. 调整输入数据形状
根据你的业务逻辑选择以下一种方式重塑输入:
情况1:将每个特征视为一个时间步,每个时间步仅1个特征
# 重塑x_train为(样本数, 时间步=8, 特征数=1) x_train = x_train.reshape((x_train.shape[0], x_train.shape[1], 1))此时调用模型时要对应修改参数:
model_mlp = get_lstm_model(8, 1) # shape_input=8(时间步),num_output=1(特征数)情况2:将8个特征作为单个时间步的输入
# 重塑x_train为(样本数, 时间步=1, 特征数=8) x_train = x_train.reshape((x_train.shape[0], 1, x_train.shape[1]))对应调用模型:
model_mlp = get_lstm_model(1, 8) # shape_input=1(时间步),num_output=8(特征数)
2. 修正模型输出层
因为你使用categorical_crossentropy损失,且y_train是5维分类标签,模型最后需要添加一个输出维度为5的全连接层,激活函数用softmax:
修改后的模型定义:
def get_lstm_model(shape_input, num_output): model = Sequential([ layers.Input((shape_input, num_output)), layers.LSTM(64), layers.Dense(32, activation='relu'), layers.Dense(5, activation='softmax') # 新增:匹配y_train的5维分类 ]) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) return model
3. 完整拟合流程示例(以情况1为例)
# 重塑输入 x_train = x_train.reshape((2134, 8, 1)) # 初始化模型 model_mlp = get_lstm_model(8, 1) # 查看模型结构确认输入输出 model_mlp.summary() # 拟合模型 model_history = model_mlp.fit(x_train, y_train, validation_split=0.2, epochs=500, batch_size=5000)
内容的提问来源于stack exchange,提问作者Rauf Anwar
相关产品推荐
相关产品推荐

