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

PyTorch Forecasting中TimeSeriesDataSet在DataLoader返回None报错问题

解决方案:PyTorch-Forecasting多目标DataLoader报错处理

问题根源

当处理多目标变量时,TimeSeriesDataSet返回的目标结构为(目标张量列表, 权重张量),其中权重张量为None,而PyTorch默认的default_collate无法处理None类型,因此触发报错。同时需确保DataSet的多目标配置正确,否则会加剧格式问题。

步骤1:确认TimeSeriesDataSet的多目标配置

创建DataSet时,必须将target参数设为包含所有30个目标列名的列表,且搭配MultiNormalizer作为归一化器:

# 假设你的30个目标列名为target_0到target_29
target_columns = [f"target_{i}" for i in range(30)]

dataset = TimeSeriesDataSet(
    data=your_dataframe,
    target=target_columns,  # 关键:传入多目标列列表
    time_idx="time_step",  # 你的时间索引列名
    max_encoder_length=10,  # 对应"前10步预测下一步"的需求
    max_decoder_length=1,
    # 其他必要参数(如静态特征、编码器特征等)
    target_normalizer=MultiNormalizer()  # 必须用MultiNormalizer处理多目标归一化
)

步骤2:自定义DataLoader的collate_fn

编写自定义的collate函数,过滤掉None权重,并将30个目标张量合并为形状(batch_size, 30)的单个张量:

import torch
from torch.utils.data import DataLoader

def multi_target_collate(batch):
    # 拆分每个样本的输入特征和目标部分
    input_features = [sample[0] for sample in batch]
    target_lists = [sample[1][0] for sample in batch]  # 提取目标张量列表,忽略None权重
    
    # 将每个样本的30个单值张量堆叠为(30,),再按批次堆叠为(batch_size, 30)
    collated_targets = torch.stack([torch.stack(targets) for targets in target_lists], dim=0)
    
    # 用默认collate处理输入特征字典
    collated_inputs = torch.utils.data.default_collate(input_features)
    
    return collated_inputs, collated_targets

步骤3:使用自定义collate创建DataLoader

train_loader = DataLoader(
    dataset,
    batch_size=32,  # 根据你的显存调整
    shuffle=False,  # 时序数据通常不shuffle
    collate_fn=multi_target_collate
)

验证效果

取一个批次测试输出格式:

batch_inputs, batch_targets = next(iter(train_loader))
print(batch_targets.shape)  # 应输出 torch.Size([32, 30])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:55:07