LSTM模型输入形状不匹配警告及预测输出异常问题求助
问题背景
我拥有维度为(17544, 1)的小时级电力消耗时序数据,目标是用过去7天(168小时)的数据预测未来24小时的消耗。训练数据预处理和模型构建完成后,用(168,1)的外部数据验证时,输出形状为(168,24),且收到输入形状不匹配的警告:
WARNING:tensorflow:Model was constructed with shape (None, 168, 1) for input KerasTensor(type_spec=TensorSpec(shape=(None, 168, 1), dtype=tf.float32, name='lstm_3_input'), name='lstm_3_input', description="created by layer 'lstm_3_input'"), but it was called on an input with incompatible shape (None, 1, 1).
核心问题:输入数据形状不符合模型预期
模型训练时,输入的X_train形状是(样本数, 168, 1),三个维度分别代表:
- 第一个维度:样本数量
- 第二个维度:时间步长(168小时)
- 第三个维度:特征数(1)
但你用于预测的(168,1)数据,直接传入模型时,TensorFlow会默认解析为(168, 1, 1)——即168个独立样本,每个样本仅包含1个时间步、1个特征,完全不符合模型要求的输入格式。
错误表现对应
- 输入形状警告:模型期望输入为
(None, 168, 1),实际传入的是(None, 1, 1) - 异常输出形状:模型把每个单时间步数据当成独立样本,输出了168组各24个预测值,而非预期的1组24个预测值
解决方法:调整预测输入的形状
需要将(168,1)的输入数据重塑为(1, 168, 1),即1个样本,包含168个时间步、1个特征。具体代码如下:
import numpy as np # 假设你的验证输入数据是test_input,形状为(168,1) test_input = np.array([[17.6], [38.2], ..., [46.1]]) # 重塑输入形状为(1, 168, 1) test_input_reshaped = np.reshape(test_input, (1, test_input.shape[0], 1)) # 执行预测 predictions = model.predict(test_input_reshaped) # 提取24个预测值,此时predictions形状为(1,24) predicted_values = predictions[0]
额外优化:修正数据集生成函数的循环条件
你的Create_Dataset函数循环条件range(lookback, len(df)-lookback)存在数据浪费问题,无法利用数据集的最后部分数据。正确的循环条件应确保每个样本能对应完整的预测窗口:
def Create_Dataset(df, lookback=1, prediction_horizon=1): X, Y = [], [] # 修改循环终止条件,确保能取到最后一组有效样本 for i in range(lookback, len(df) - prediction_horizon + 1): X.append(df[i-lookback : i, 0]) Y.append(df[i : i + prediction_horizon, 0]) return np.array(X), np.array(Y)
内容的提问来源于stack exchange,提问作者Kosmylo

