如何构建符合指定输入输出形状的TensorFlow时间序列预测模型
适配方案说明
你需要调整模型的编解码结构,实现从过去10步输入到未来10步输出的映射,核心通过RepeatVector层完成时间步长度的匹配,具体修改如下:
核心修改逻辑
- 把原有第二层LSTM的
return_sequences参数改为False,得到输入序列编码后的全局特征向量 - 新增
RepeatVector(N_FUTURE)层,将全局特征向量复制为10份,匹配输出要求的10个时间步长度 - 新增一层LSTM作为解码器,设置
return_sequences=True,对每个时间步的特征做解码 - 后续Dense层会自动作用在每个时间步上,输出对应时间步的预测值
修改后完整可运行代码
import tensorflow as tf BATCH_SIZE = 32 # 建议不要修改该参数 N_PAST = 10 # 请勿修改该参数 N_FUTURE = 10 # 请勿修改该参数 SHIFT = 1 N_FEATURES = 1 # 补充缺失的特征数定义 model = tf.keras.models.Sequential([ # 编码器部分:处理过去10步输入 tf.keras.layers.Conv1D(filters=32, kernel_size=5, strides=1, padding="causal", activation="relu", input_shape=[N_PAST, N_FEATURES]), # 固定输入形状匹配你的要求 tf.keras.layers.LSTM(64, return_sequences=True), tf.keras.layers.LSTM(64, return_sequences=False), # 关闭返回序列,得到全局编码向量 # 适配输出时间步的核心层 tf.keras.layers.RepeatVector(N_FUTURE), # 复制为10个时间步,匹配输出长度要求 # 解码器部分:生成未来10步输出 tf.keras.layers.LSTM(64, return_sequences=True), # 必须开启返回序列 tf.keras.layers.Dense(30, activation="relu"), tf.keras.layers.Dense(10, activation="relu"), tf.keras.layers.Dense(N_FEATURES) ]) # 验证形状符合要求 model.build(input_shape=(BATCH_SIZE, N_PAST, N_FEATURES)) print(model.output_shape) # 输出为 (32, 10, 1),完全匹配需求
简化方案(适合简单时序场景)
如果不想新增额外LSTM层,可以直接在第二层LSTM(return_sequences=False)之后添加tf.keras.layers.Reshape((N_FUTURE, N_FEATURES))直接调整输出形状,不过预测效果会比编解码结构稍差。
内容的提问来源于stack exchange,提问作者WAIWAI
相关产品推荐
相关产品推荐

