I am using Pytorch_forecasting library with NBeats and ThmporalFusionTransformer(tft) methods for univariate and multivariate forecasting in the same pipeline respectively. Univariate forecasting is working with NBeats but getting NAN in prediction for tft. It's not able to return best_model_path due to which predictions tensors are NAN. It's working fine on Jupyter notebook, but above error in pipeline.
best_model_path = trainer.checkpoint_callback.best_model_path
print('best_model_path', best_model_path)
best_tft = TemporalFusionTransformer.load_from_checkpoint(best_model_path)
best_model_path comes out empty.
This may be because the same lightning_log folder is being used for both univariate and multivariate model. How to initialize a new lightning_log folder for new model via pytorch_lightning ? Below is code structure i have used.
def prepare_data_multivariate(train_data, test_data, selected_features, target, market, prediction_length = 6):
if test_data is not None:
data = pd.concat([train_data, test_data])
else:
data = train_data
data = add_time_index(data, market)
max_encoder_length = prediction_length * 4
max_prediction_length = prediction_length
training_cutoff = data["time_idx"].max() - max_prediction_length
training = TimeSeriesDataSet(
data[lambda x: x.time_idx <= training_cutoff],
time_idx="time_idx",
target=target,
group_ids=['market'],
min_encoder_length=max_encoder_length // 2, # keep encoder length long (as it is in the validation set)
max_encoder_length=max_encoder_length,
min_prediction_length=1,
max_prediction_length=max_prediction_length,
static_categoricals=['market'],
static_reals=[],
time_varying_known_categoricals=[],
variable_groups={}, # group of categorical variables can be treated as one variable
# time_varying_known_reals=["time_idx"],
time_varying_unknown_categoricals=[],
time_varying_unknown_reals=selected_features,
add_relative_time_idx=True,
add_target_scales=True,
add_encoder_length=True,
)
validation = TimeSeriesDataSet.from_dataset(training, data, predict=True, stop_randomization=True)
batch_size = 32
train_dataloader = training.to_dataloader(train=True, batch_size=batch_size, num_workers=0)
val_dataloader = validation.to_dataloader(train=False, batch_size=batch_size * 10, num_workers=0)
return training, train_dataloader, val_dataloader
def train_model_multivariate(training, train_dataloader, val_dataloader):
early_stop_callback = EarlyStopping(monitor="val_loss", min_delta=1e-4, patience=10, verbose=False, mode="min")
lr_logger = LearningRateMonitor() # log the learning rate
# logger = TensorBoardLogger("lightning_logs") # logging results to a tensorboard
trainer = pl.Trainer(
max_epochs=30,
gpus=0,
weights_summary="top",
gradient_clip_val=0.1,
limit_train_batches=30, # coment in for training, running valiation every 30 batches
fast_dev_run=True, # comment in to check that networkor dataset has no serious bugs
callbacks=[lr_logger, early_stop_callback]
)
tft = TemporalFusionTransformer.from_dataset(
training,
learning_rate=0.1,
hidden_size=16,
attention_head_size=1,
dropout=0.1,
hidden_continuous_size=8,
output_size=7,
loss=QuantileLoss(),
log_interval=10,
reduce_on_plateau_patience=4,
)
tf.io.gfile = tb.compat.tensorflow_stub.io.gfile
# fit network
trainer.fit(
tft,
train_dataloader=train_dataloader,
val_dataloaders=val_dataloader,
)
best_model_path = trainer.checkpoint_callback.best_model_path
best_tft = TemporalFusionTransformer.load_from_checkpoint(best_model_path)
return best_tft