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

Keras ConvLSTM2D模型如何引入目标特征t0初始值进行序列预测

解决ConvLSTM2D降雨量预测中的初始目标特征传递与未来信息泄露问题

核心思路

要同时保留t0时刻的初始降雨量信息、避免未来目标特征泄露,需将输入拆分为非目标时序特征和目标初始值两个独立输入,在模型内部拼接成符合ConvLSTM要求的序列格式,训练时仅计算t1及之后预测值的损失。

具体实现步骤

1. 数据预处理调整

假设原始数据形状为(samples, sequence_length, x_grid, y_grid, num_features),最后一维包含1个目标特征(降雨量)和num_non_target = num_features - 1个非目标特征:

# 拆分非目标特征和目标特征
non_target_data = training_data[..., :-1]  # 全序列非目标特征
target_data = training_data[..., -1:]       # 全序列降雨量

# 构造训练输入:非目标特征序列 + t0时刻初始降雨量
X_non_target_train = non_target_data  # 形状:(samples, sequence_length, x_grid, y_grid, num_non_target)
X_target_init_train = target_data[:, :1, :, :, :]  # 仅t0时刻,形状:(samples, 1, x_grid, y_grid, 1)

# 构造训练目标:t1到t_{sequence_length-1}的降雨量
y_train = target_data[:, 1:, :, :, :]  # 形状:(samples, sequence_length-1, x_grid, y_grid, 1)

# 验证数据做同样处理
non_target_val = val_data[..., :-1]
target_val = val_data[..., -1:]
X_non_target_val = non_target_val
X_target_init_val = target_val[:, :1, :, :, :]
y_val = target_val[:, 1:, :, :, :]

2. 修改模型结构(多输入函数式API)

通过多输入接收非目标序列和初始目标值,在模型内部将初始目标值扩展为序列长度,再与非目标特征拼接,最后输出对应t1及之后的预测结果:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 提取数据维度参数
sequence_length = training_data.shape[1]
x_grid_length = training_data.shape[2]
y_grid_length = training_data.shape[3]
num_non_target = num_features - 1

# 输入1:非目标时序特征
input_non_target = layers.Input(shape=(sequence_length, x_grid_length, y_grid_length, num_non_target))
# 输入2:t0时刻初始降雨量
input_target_init = layers.Input(shape=(1, x_grid_length, y_grid_length, 1))

# 将初始目标值扩展为序列长度(后续时刻用0填充,不影响模型学习)
target_init_expanded = layers.RepeatVector(sequence_length)(input_target_init)
# 调整维度适配ConvLSTM输入格式
target_init_expanded = layers.Permute((1, 3, 4, 2))(target_init_expanded)

# 拼接非目标特征和扩展后的初始目标特征
combined_input = layers.Concatenate(axis=-1)([input_non_target, target_init_expanded])

# 原ConvLSTM特征提取结构
x = layers.ConvLSTM2D(filters=32,
                      kernel_size=(5,5),
                      padding="same",
                      return_sequences=True,
                      stateful=False,
                      activation="relu")(combined_input)
x = layers.ConvLSTM2D(filters=32,
                      kernel_size=(3,3),
                      padding="same",
                      return_sequences=True,
                      stateful=False,
                      activation="relu")(x)

# 生成预测并切片保留t1及之后的结果(与训练目标形状匹配)
outputs = layers.Conv3D(filters=1,
                        kernel_size=(3, 3, 3),
                        padding="same",
                        activation="sigmoid")(x)
outputs = layers.Lambda(lambda x: x[:, 1:, :, :, :])(outputs)

# 构建多输入模型
model = keras.models.Model(inputs=[input_non_target, input_target_init], outputs=outputs)

# 编译模型
loss = keras.losses.mean_squared_error
opt = keras.optimizers.Adam(learning_rate=0.001)
model.compile(loss=loss, optimizer=opt)

3. 训练模型

传入两个输入和对应的目标数据:

history = model.fit(
    [X_non_target_train, X_target_init_train],
    y_train,
    epochs=8,
    verbose=2,
    validation_data=([X_non_target_val, X_target_init_val], y_val)
)

4. 预测阶段使用

预测时传入待预测样本的完整非目标时序特征和t0时刻初始降雨量,模型直接输出t1及之后的降雨量预测:

# 处理测试数据
non_target_test = test_data[..., :-1]
target_init_test = test_data[:, :1, :, :, -1:]

# 生成预测结果
predictions = model.predict([non_target_test, target_init_test])

关键说明

  • 模型内部扩展初始目标值时的填充0,不会干扰训练效果,因为损失函数仅计算t1及之后的预测误差
  • 该设计彻底避免了未来目标特征泄露,输入仅包含t0时刻的目标信息,其余时刻目标值完全由模型自主预测
  • 无需使用有状态模型,时序依赖完全通过ConvLSTM的序列处理能力实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:35:44