使用Darts训练N-Beats时多序列输入损失为NaN,单序列正常
问题:Darts N-Beats多序列训练出现NaN损失,单序列训练正常
我想用Darts训练一个N-Beats时间序列模型,每个用户对应独立的时间序列DataFrame,因此打算采用多序列训练方式,但输入TimeSeries列表时,训练过程中直接出现NaN损失;若将所有用户的TimeSeries合并为单个序列,则能得到正常损失。两种场景下的数据均经过缩放、填充并转换为float32类型,预处理代码如下:
data = scaler.transform(filler.transform(data)).astype(np.float32)
以下是将TimeSeries列表合并为单个TimeSeries的代码(我也有纯Darts实现的版本,但速度慢很多,效果一致):
SPLIT = 0.8 if concatenate_to_one_ts: all_dfs = [] all_dfs_cov = [] for i in range(len(list_of_target_ts)): all_dfs.append(list_of_target_ts[i].pd_series()) all_dfs_cov.append(list_of_cov_ts[i].pd_dataframe()) all_dfs = pd.concat(all_dfs) all_dfs_cov = pd.concat(all_dfs_cov) nbr_train_sample = int(len(all_dfs) * SPLIT) all_dfs_train = all_dfs[:nbr_train_sample] all_dfs_test = all_dfs[nbr_train_sample:] list_of_target_ts_train = TimeSeries.from_series(all_dfs_train.reset_index(drop=True)) list_of_target_ts_test = TimeSeries.from_series(all_dfs_test.reset_index(drop=True)) all_dfs_cov_train = all_dfs_cov[:nbr_train_sample] all_dfs_cov_test = all_dfs_cov[nbr_train_sample:] list_of_cov_ts_train = TimeSeries.from_dataframe(all_dfs_cov_train.reset_index(drop=True)) list_of_cov_ts_test = TimeSeries.from_dataframe(all_dfs_cov_test.reset_index(drop=True)) else: nbr_train_sample = int(len(list_of_target_ts) * SPLIT) list_of_target_ts_train = list_of_target_ts[:nbr_train_sample] list_of_target_ts_test = list_of_target_ts[nbr_train_sample:] list_of_cov_ts_train = list_of_cov_ts[:nbr_train_sample] list_of_cov_ts_test = list_of_cov_ts[nbr_train_sample:] model = NBEATSModel(input_chunk_length=4, output_chunk_length=1, batch_size=512, n_epochs=5, nr_epochs_val_period=1, model_name="NBEATS_test", generic_architecture=True, force_reset=True, save_checkpoints=True, show_warnings=True, log_tensorboard=True, torch_device_str='cuda:0' ) model.fit(series=list_of_target_ts_train, past_covariates=list_of_cov_ts_train, val_series=list_of_target_ts_val, val_past_covariates=list_of_cov_ts_val, verbose=True, num_loader_workers=20)
训练输出对比
- 多序列训练时的输出:
Epoch 0: 8%|██████████▉ | 2250/27807 [03:00<34:11, 12.46it/s, loss=nan, v_num=logs, train_loss=nan.0
- 单序列训练时的输出:
Epoch 0: 24%|█████████████████████████▋ | 669/2783 [01:04<03:24, 10.33it/s, loss=0.00758, v_num=logs, train_loss=0.00875]
额外疑惑
相同batch size下,每个epoch的样本数与预期不符。根据相关资料,单序列的样本数应该更多,因为多序列会对每个序列进行窗口切割,但实际输出中多序列的样本数(27807)远多于单序列(2783),对此存在疑问。
内容的提问来源于stack exchange,提问作者phoenire
相关产品推荐
相关产品推荐

