from src.models.lstm_model import GRUModel from src.data import DataProcessor, DataConfig from src.trainers.quantile_trainer import AutoRegressiveQuantileTrainer from src.trainers.trainer import Trainer from src.utils.clearml import ClearMLHelper from src.models import * from src.losses import * import torch from torch.nn import MSELoss, L1Loss import torch.nn as nn from src.models.time_embedding_layer import TimeEmbedding #### ClearML #### clearml_helper = ClearMLHelper(project_name="Thesis/NrvForecast") task = clearml_helper.get_task(task_name="Autoregressive Quantile Regression: GRU + Quarter + DoW + Load + Wind + Net") #### Data Processor #### data_config = DataConfig() data_config.NRV_HISTORY = True data_config.LOAD_HISTORY = True data_config.LOAD_FORECAST = True data_config.WIND_FORECAST = True data_config.WIND_HISTORY = True data_config.QUARTER = True data_config.DAY_OF_WEEK = True data_config.NOMINAL_NET_POSITION = True data_config = task.connect(data_config, name="data_features") data_processor = DataProcessor(data_config, path="", lstm=True) data_processor.set_batch_size(512) data_processor.set_full_day_skip(False) #### Hyperparameters #### data_processor.set_output_size(1) inputDim = data_processor.get_input_size() epochs = 300 # add parameters to clearml quantiles = task.get_parameter("general/quantiles", cast=True) # make sure it is a list if quantiles is None: quantiles = [0.01, 0.05, 0.1, 0.15, 0.3, 0.4, 0.5, 0.6, 0.7, 0.85, 0.9, 0.95, 0.99] task.set_parameter("general/quantiles", quantiles) else: # if string, convert to list "[0.01, 0.05, 0.1, 0.15, 0.3, 0.4, 0.5, 0.6, 0.7, 0.85, 0.9, 0.95, 0.99]"" if isinstance(quantiles, str): quantiles = eval(quantiles) model_parameters = { "learning_rate": 0.0001, "hidden_size": 512, "num_layers": 2, "dropout": 0.2, "time_feature_embedding": 4, } model_parameters = task.connect(model_parameters, name="model_parameters") time_embedding = TimeEmbedding(data_processor.get_time_feature_size(), model_parameters["time_feature_embedding"]) lstm_model = GRUModel(time_embedding.output_dim(inputDim), len(quantiles), hidden_size=model_parameters["hidden_size"], num_layers=model_parameters["num_layers"], dropout=model_parameters["dropout"]) model = nn.Sequential(time_embedding, lstm_model) optimizer = torch.optim.Adam(model.parameters(), lr=model_parameters["learning_rate"]) #### Trainer #### trainer = AutoRegressiveQuantileTrainer( model, inputDim, optimizer, data_processor, quantiles, "cuda", debug=False, ) trainer.add_metrics_to_track( [PinballLoss(quantiles), MSELoss(), L1Loss(), CRPSLoss(quantiles)] ) trainer.early_stopping(patience=30) trainer.plot_every(5) trainer.train(task=task, epochs=epochs, remotely=True)