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
相关产品推荐
相关产品推荐

