Implemented Non Autorgressive Quantile Regression

This commit is contained in:
Victor Mylle
2023-11-18 17:42:06 +00:00
parent 75f1f64c38
commit 1268af47a6
9 changed files with 196493 additions and 161 deletions

View File

@@ -67,6 +67,8 @@ class Trainer:
task.connect(self.criterion, name="criterion")
task.connect(self.data_processor, name="data_processor")
task.connect(self.data_processor.data_config, name="data_features")
return task
def random_samples(self, train: bool = True, num_samples: int = 10):
@@ -82,58 +84,68 @@ class Trainer:
def train(self, epochs: int):
train_loader, test_loader = self.data_processor.get_dataloaders(predict_sequence_length=self.model.output_size)
try:
train_loader, test_loader = self.data_processor.get_dataloaders(predict_sequence_length=self.model.output_size)
train_samples = self.random_samples(train=True)
test_samples = self.random_samples(train=False)
train_samples = self.random_samples(train=True)
test_samples = self.random_samples(train=False)
task = self.init_clearml_task()
task = self.init_clearml_task()
self.best_score = None
counter = 0
self.best_score = None
counter = 0
for epoch in range(1, epochs + 1):
self.model.train()
running_loss = 0.0
for epoch in range(1, epochs + 1):
self.model.train()
running_loss = 0.0
for inputs, targets in train_loader:
inputs, targets = inputs.to(self.device), targets.to(self.device)
for inputs, targets in train_loader:
inputs, targets = inputs.to(self.device), targets.to(self.device)
self.optimizer.zero_grad()
output = self.model(inputs)
self.optimizer.zero_grad()
output = self.model(inputs)
loss = self.criterion(output, targets)
loss.backward()
self.optimizer.step()
loss = self.criterion(output, targets)
loss.backward()
self.optimizer.step()
running_loss += loss.item()
running_loss += loss.item()
running_loss /= len(train_loader.dataset)
test_loss = self.test(test_loader)
running_loss /= len(train_loader.dataset)
test_loss = self.test(test_loader)
if self.patience is not None:
if self.best_score is None or test_loss < self.best_score + self.delta:
self.save_checkpoint(test_loss, task, epoch)
counter = 0
else:
counter += 1
if counter >= self.patience:
print('Early stopping triggered')
break
if self.patience is not None:
if self.best_score is None or test_loss < self.best_score + self.delta:
self.save_checkpoint(test_loss, task, epoch)
counter = 0
else:
counter += 1
if counter >= self.patience:
print('Early stopping triggered')
break
if task:
task.get_logger().report_scalar(title=self.criterion.__class__.__name__, series="train", value=running_loss, iteration=epoch)
task.get_logger().report_scalar(title=self.criterion.__class__.__name__, series="test", value=test_loss, iteration=epoch)
if epoch % self.plot_every_n_epochs == 0:
self.debug_plots(task, True, train_loader, train_samples, epoch)
self.debug_plots(task, False, test_loader, test_samples, epoch)
if hasattr(self, 'plot_quantile_percentages'):
self.plot_quantile_percentages(task, train_loader, True, epoch)
self.plot_quantile_percentages(task, test_loader, False, epoch)
if task:
task.get_logger().report_scalar(title=self.criterion.__class__.__name__, series="train", value=running_loss, iteration=epoch)
task.get_logger().report_scalar(title=self.criterion.__class__.__name__, series="test", value=test_loss, iteration=epoch)
if epoch % self.plot_every_n_epochs == 0:
self.debug_plots(task, True, train_loader, train_samples, epoch)
self.debug_plots(task, False, test_loader, test_samples, epoch)
if task:
self.finish_training(task=task)
task.close()
self.finish_training(task=task)
task.close()
except Exception:
if task:
task.close()
task.set_archived(True)
raise
def log_final_metrics(self, task, dataloader, train: bool = True):
@@ -178,10 +190,12 @@ class Trainer:
self.model.load_state_dict(torch.load('checkpoint.pt'))
self.model.eval()
transformed_train_loader, transformed_test_loader = self.data_processor.get_dataloaders(predict_sequence_length=self.model.output_size)
train_loader, test_loader = self.data_processor.get_dataloaders(predict_sequence_length=self.model.output_size)
# self.log_final_metrics(task, transformed_train_loader, train=True)
self.log_final_metrics(task, transformed_test_loader, train=False)
if not hasattr(self, 'plot_quantile_percentages'):
self.log_final_metrics(task, train_loader, train=True)
self.log_final_metrics(task, test_loader, train=False)
def test(self, test_loader: torch.utils.data.DataLoader):
@@ -242,9 +256,9 @@ class Trainer:
fig.add_trace(trace, row=row, col=col)
loss = self.criterion(predictions.to(self.device), target.squeeze(-1).to(self.device)).item()
# loss = self.criterion(predictions.to(self.device), target.squeeze(-1).to(self.device)).item()
fig['layout']['annotations'][i].update(text=f"{loss.__class__.__name__}: {loss:.6f}")
# fig['layout']['annotations'][i].update(text=f"{loss.__class__.__name__}: {loss:.6f}")
# y axis same for all plots
fig.update_yaxes(range=[-1, 1], col=1)