You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,模型也会适配这种输出逻辑,导致预测时产生多个结果。
解决方案
  1. 调整训练标签维度
    确保data_train_y的形状为(样本数量, 1),即每个长度为12的输入序列对应一个标签(下一个月的目标值),而非(样本数量, 12)这类序列形式的标签。

  2. 确认模型结构无需修改
    模型最后一层LSTM设置return_sequences=False、Dense层输出维度为1的配置是正确的,这部分无需调整,重点是对齐训练数据的标签维度。

  3. 重新训练模型
    调整好data_train_y的维度后,重新运行超参数搜索和训练流程,让模型学习“输入12个月数据→输出1个月数据”的映射关系。

  4. 验证预测结果
    预测输入tensor_pred的形状(1,12,13)是正确的,重新训练完成后再次预测,应该得到形状为(1,1)的单个预测值。

内容的提问来源于stack exchange,提问作者JungleKing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:07:08