Keras LSTM时间序列回溯预测:输入形状不匹配问题求助
LSTM输入格式适配与回溯预测解决方案
一、输入形状问题排查与修正
LSTM要求输入为**(batch_size, timesteps, features)**的3D张量,你当前的2D输入(batch size, inputs)完全不符合要求,必须严格对齐训练阶段的维度逻辑:
核心错误点
不要直接将单条2D数据强行reshape为(1,24,10)——这会把10个特征错误拆分为24个时间步,完全违背时序数据的逻辑。正确的输入应该是包含24个连续时间步、每个时间步10个特征的序列。正确维度转换代码
- 单样本预测:若你的原始输入是24个时间步的特征序列(形状
(24,10)),转换为模型要求的格式:# 原始输入:24步,每步10个特征 input_data = raw_input.reshape(1, 24, 10) # 补batch维度,最终形状(1,24,10) - 批量预测:若有N个回溯样本,每个样本是24步10特征的序列:
input_data = raw_input.reshape(N, 24, 10)
- 单样本预测:若你的原始输入是24个时间步的特征序列(形状
二、回溯预测实现(处理NaN目标变量)
仅用3年数据预测40年属于多步时序预测,针对目标变量Return、Supply为NaN的情况,采用递归预测逻辑:
递归预测核心流程
- 用训练数据的最后24步作为起始输入序列
- 每次预测出下一个时间步的
Return、Supply - 将预测结果补充到输入序列末尾,同时丢弃最前面的时间步,循环执行直到完成40年的预测
代码示例(含NaN处理)
import numpy as np import tensorflow as tf # 假设model是训练完成的LSTM模型,输入形状(None,24,10),输出为(Return, Supply)两个值 # 初始化起始输入:取训练数据最后24步,转换为模型要求的格式 current_input = train_data[-24:].reshape(1, 24, 10) predictions = [] # 按时间粒度计算总预测步数:假设每年12个时间步,40年共480步 total_steps = 40 * 12 for _ in range(total_steps): # 预测当前输入对应的下一个时间步结果 pred = model.predict(current_input, verbose=0) predictions.append(pred[0]) # 构造新的时间步特征:填充预测的Return、Supply,其他特征用前一步值补全 new_step = np.zeros((1, 1, 10)) new_step[0, 0, -2:] = pred # 假设输入特征最后两位是Return、Supply new_step[0, 0, :-2] = current_input[0, -1, :-2] # 其他特征沿用前一步数据 # 更新输入序列:去掉最旧的1步,加入新预测的步 current_input = np.concatenate([current_input[:, 1:, :], new_step], axis=1) # 将预测结果转为数组 predictions = np.array(predictions)注:若输入特征存在NaN,需先做填充处理(前向填充、均值填充均可),LSTM无法处理含NaN的输入数据。
三、形状不匹配报错快速排查
若仍报维度错误,按以下步骤验证:
- 执行
model.summary(),确认输入层定义(比如Input(shape=(24,10))) - 打印输入数据形状:
print(input_data.shape),确保与输入层要求的(batch_size,24,10)完全一致 - 若输入无batch维度,用
np.expand_dims(input_data, axis=0)补充,避免遗漏维度
内容的提问来源于stack exchange,提问作者ronaldhoward33
相关产品推荐
相关产品推荐

