使用LSTM模型做单步预测却输出多结果,求排查模型结构
问题
搭建LSTM模型用于时间序列预测,训练完成后,使用形状为(12,13)的12个月时序数据(含13个特征)预测下一个月的数据,但输入该数据后模型输出了12个预测结果,预期仅为1个。相关代码及信息如下:
模型构建代码
def build_model(hp): grid_model = Sequential() grid_model.add(LSTM(hp.Int('input_unit',min_value=32,max_value=512,step=32),return_sequences=True,\ input_shape=(data_train_x.shape[1],data_train_x.shape[2]))) # (12,13) time steps + features for i in range(hp.Int('n_layers', 1, 3)): grid_model.add(LSTM(hp.Int(f'lstm_{i}_units',min_value=32,max_value=512,step=32),return_sequences=True)) grid_model.add(LSTM(hp.Int('last_layer_unit',min_value=32,max_value=512,step=32),return_sequences=False)) grid_model.add(Dropout(hp.Float('Dropout_rate',min_value=0.1,max_value=0.5,step=0.1))) grid_model.add(Dense(1, activation=hp.Choice('dense_activation',values=['relu', 'sigmoid'],default='relu'))) optimizer = hp.Choice('optimizer', values = ['adam', 'rmsprop', 'adadelta']) grid_model.compile(loss='mean_squared_error', optimizer = optimizer ,metrics = ['mse']) #set learning rate learning_rate = hp.Choice('lr', [0.02, 0.01, 0.005]) K.set_value(grid_model.optimizer.learning_rate, learning_rate) return grid_model
训练参数
tuner.search(x=data_train_x, y=data_train_y, epochs = 50, batch_size =10, validation_split = 0.15, shuffle = False, callbacks = [stop_early])
预测代码
tensor_pred形状为(1,12,13)
new_pred = hypermodel.predict(tensor_pred); new_pred
逆缩放后的预测结果
array([756459.4 , 753678.1 , 724612.6 , 727920.5 , 721956. , 710755.5 , 717139.7 , 713023.06, 705151.2 , 705286.5 , 700536.7 , 691794.06], dtype=float32)
问题原因分析
核心问题出在训练标签的维度与预测任务不匹配:
- 你的模型结构最终通过
return_sequences=False的LSTM层将序列压缩为单个向量,再用Dense(1)输出单个值,理论上应输出1个预测结果。但实际输出12个结果,说明训练时的data_train_y是每个时间步对应一个标签(序列到序列的训练模式),而非每个输入序列对应一个标签(序列到单值的预测模式)。 - 当模型被训练为对输入序列的每个时间步输出预测值时,即使最后一层设置了
return_sequences=False,模型也会适配这种输出逻辑,导致预测时产生多个结果。
解决方案
调整训练标签维度
确保data_train_y的形状为(样本数量, 1),即每个长度为12的输入序列对应一个标签(下一个月的目标值),而非(样本数量, 12)这类序列形式的标签。确认模型结构无需修改
模型最后一层LSTM设置return_sequences=False、Dense层输出维度为1的配置是正确的,这部分无需调整,重点是对齐训练数据的标签维度。重新训练模型
调整好data_train_y的维度后,重新运行超参数搜索和训练流程,让模型学习“输入12个月数据→输出1个月数据”的映射关系。验证预测结果
预测输入tensor_pred的形状(1,12,13)是正确的,重新训练完成后再次预测,应该得到形状为(1,1)的单个预测值。
内容的提问来源于stack exchange,提问作者JungleKing
相关产品推荐
相关产品推荐

