From fc1a605b0141f9c7a70f7b13f6f254a1b032e31e Mon Sep 17 00:00:00 2001 From: wassname Date: Tue, 22 Nov 2022 21:54:58 +0800 Subject: [PATCH] wip --- data/datasets.py | 24 +- experiments/configs/ECL/192M.gin | 37 -- experiments/configs/ECL/336M.gin | 37 -- experiments/configs/ECL/720M.gin | 37 -- experiments/configs/ECL/96M.gin | 37 -- experiments/configs/ETTm2/192M.gin | 37 -- experiments/configs/ETTm2/192S.gin | 37 -- experiments/configs/ETTm2/336M.gin | 37 -- experiments/configs/ETTm2/336S.gin | 37 -- experiments/configs/ETTm2/720M.gin | 37 -- experiments/configs/ETTm2/720S.gin | 37 -- experiments/configs/ETTm2/96M.gin | 37 -- experiments/configs/ETTm2/96S.gin | 37 -- experiments/configs/Exchange/192M.gin | 37 -- experiments/configs/Exchange/192S.gin | 37 -- experiments/configs/Exchange/336M.gin | 37 -- experiments/configs/Exchange/336S.gin | 37 -- experiments/configs/Exchange/720M.gin | 37 -- experiments/configs/Exchange/720S.gin | 37 -- experiments/configs/Exchange/96M.gin | 37 -- experiments/configs/Exchange/96S.gin | 37 -- experiments/configs/ILI/24M.gin | 37 -- experiments/configs/ILI/36M.gin | 37 -- experiments/configs/ILI/48M.gin | 37 -- experiments/configs/ILI/60M.gin | 37 -- experiments/configs/Stocks/96M2S.gin | 10 +- experiments/configs/Traffic/192M.gin | 37 -- experiments/configs/Traffic/336M.gin | 37 -- experiments/configs/Traffic/720M.gin | 37 -- experiments/configs/Traffic/96M.gin | 37 -- experiments/configs/Weather/192M.gin | 37 -- experiments/configs/Weather/336M.gin | 37 -- experiments/configs/Weather/720M.gin | 37 -- experiments/configs/Weather/96M.gin | 37 -- experiments/configs/hp_search/ECL.gin | 37 -- experiments/configs/hp_search/ETTm2.gin | 37 -- experiments/configs/hp_search/Exchange.gin | 37 -- experiments/configs/hp_search/ILI.gin | 37 -- experiments/configs/hp_search/Stocks.gin | 47 +++ experiments/configs/hp_search/Traffic.gin | 37 -- experiments/configs/hp_search/Weather.gin | 37 -- mjc_notes.md | 20 +- models/DeepTIMe3.py | 51 ++- models/modules/encoders.py | 272 ++++++++++++++ models/modules/metareghead.py | 79 ++++ models/modules/regressors.py | 11 +- run.sh | 3 +- scratch-run_exp.ipynb | 404 +++++++++++++++++---- 48 files changed, 803 insertions(+), 1524 deletions(-) delete mode 100644 experiments/configs/ECL/192M.gin delete mode 100644 experiments/configs/ECL/336M.gin delete mode 100644 experiments/configs/ECL/720M.gin delete mode 100644 experiments/configs/ECL/96M.gin delete mode 100644 experiments/configs/ETTm2/192M.gin delete mode 100644 experiments/configs/ETTm2/192S.gin delete mode 100644 experiments/configs/ETTm2/336M.gin delete mode 100644 experiments/configs/ETTm2/336S.gin delete mode 100644 experiments/configs/ETTm2/720M.gin delete mode 100644 experiments/configs/ETTm2/720S.gin delete mode 100644 experiments/configs/ETTm2/96M.gin delete mode 100644 experiments/configs/ETTm2/96S.gin delete mode 100644 experiments/configs/Exchange/192M.gin delete mode 100644 experiments/configs/Exchange/192S.gin delete mode 100644 experiments/configs/Exchange/336M.gin delete mode 100644 experiments/configs/Exchange/336S.gin delete mode 100644 experiments/configs/Exchange/720M.gin delete mode 100644 experiments/configs/Exchange/720S.gin delete mode 100644 experiments/configs/Exchange/96M.gin delete mode 100644 experiments/configs/Exchange/96S.gin delete mode 100644 experiments/configs/ILI/24M.gin delete mode 100644 experiments/configs/ILI/36M.gin delete mode 100644 experiments/configs/ILI/48M.gin delete mode 100644 experiments/configs/ILI/60M.gin delete mode 100644 experiments/configs/Traffic/192M.gin delete mode 100644 experiments/configs/Traffic/336M.gin delete mode 100644 experiments/configs/Traffic/720M.gin delete mode 100644 experiments/configs/Traffic/96M.gin delete mode 100644 experiments/configs/Weather/192M.gin delete mode 100644 experiments/configs/Weather/336M.gin delete mode 100644 experiments/configs/Weather/720M.gin delete mode 100644 experiments/configs/Weather/96M.gin delete mode 100644 experiments/configs/hp_search/ECL.gin delete mode 100644 experiments/configs/hp_search/ETTm2.gin delete mode 100644 experiments/configs/hp_search/Exchange.gin delete mode 100644 experiments/configs/hp_search/ILI.gin create mode 100644 experiments/configs/hp_search/Stocks.gin delete mode 100644 experiments/configs/hp_search/Traffic.gin delete mode 100644 experiments/configs/hp_search/Weather.gin create mode 100644 models/modules/encoders.py create mode 100644 models/modules/metareghead.py diff --git a/data/datasets.py b/data/datasets.py index 8eba20c..f223adc 100644 --- a/data/datasets.py +++ b/data/datasets.py @@ -131,6 +131,20 @@ class ForecastDataset(Dataset): if self.cross_learn: return self.n_time_samples * self.n_dims return self.n_time_samples + + def get_inds(self, idx): + cx_start = idx + cx_end = cx_start + self.lookback_len + c_start = cx_end + self.gap + c_end = c_start + self.horizon_len + + q_start = c_end + self.gap + q_end = q_start + self.horizon_len + + qx_end = q_start + qx_start = qx_end - self.lookback_len + + return cx_start, cx_end, c_start, c_end, qx_start, qx_end, q_start, q_end def __getitem__(self, idx: int) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]: if self.cross_learn: @@ -139,16 +153,8 @@ class ForecastDataset(Dataset): idx = idx % self.n_time_samples else: dim_slice = slice(None) - - cx_start = idx - cx_end = cx_start + self.lookback_len - c_start = cx_end + self.gap - c_end = c_start + self.horizon_len - qx_start = cx_end + self.gap - qx_end = qx_start + self.lookback_len - q_start = qx_end + self.gap - q_end = q_start + self.horizon_len + cx_start, cx_end, c_start, c_end, qx_start, qx_end, q_start, q_end = self.get_inds(idx) context_past_x = self.data_x[cx_start:cx_end, dim_slice] context_y = self.data_y[c_start:c_end, dim_slice] diff --git a/experiments/configs/ECL/192M.gin b/experiments/configs/ECL/192M.gin deleted file mode 100644 index de114f0..0000000 --- a/experiments/configs/ECL/192M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ECL/192M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'electricity/electricity.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 192 -ForecastDataset.lookback_mult = 5 diff --git a/experiments/configs/ECL/336M.gin b/experiments/configs/ECL/336M.gin deleted file mode 100644 index eee2673..0000000 --- a/experiments/configs/ECL/336M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ECL/336M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'electricity/electricity.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 336 -ForecastDataset.lookback_mult = 3 diff --git a/experiments/configs/ECL/720M.gin b/experiments/configs/ECL/720M.gin deleted file mode 100644 index 995c5fb..0000000 --- a/experiments/configs/ECL/720M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ECL/720M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'electricity/electricity.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 720 -ForecastDataset.lookback_mult = 1 diff --git a/experiments/configs/ECL/96M.gin b/experiments/configs/ECL/96M.gin deleted file mode 100644 index 546cce6..0000000 --- a/experiments/configs/ECL/96M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ECL/96M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'electricity/electricity.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 96 -ForecastDataset.lookback_mult = 9 diff --git a/experiments/configs/ETTm2/192M.gin b/experiments/configs/ETTm2/192M.gin deleted file mode 100644 index 2687ecd..0000000 --- a/experiments/configs/ETTm2/192M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ETTm2/192M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'ETT-small/ETTm2.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 192 -ForecastDataset.lookback_mult = 5 diff --git a/experiments/configs/ETTm2/192S.gin b/experiments/configs/ETTm2/192S.gin deleted file mode 100644 index 67684ea..0000000 --- a/experiments/configs/ETTm2/192S.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ETTm2/192S' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'ETT-small/ETTm2.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 192 -ForecastDataset.lookback_mult = 3 diff --git a/experiments/configs/ETTm2/336M.gin b/experiments/configs/ETTm2/336M.gin deleted file mode 100644 index f609ef8..0000000 --- a/experiments/configs/ETTm2/336M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ETTm2/336M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'ETT-small/ETTm2.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 336 -ForecastDataset.lookback_mult = 3 diff --git a/experiments/configs/ETTm2/336S.gin b/experiments/configs/ETTm2/336S.gin deleted file mode 100644 index 3d2debb..0000000 --- a/experiments/configs/ETTm2/336S.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ETTm2/336S' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'ETT-small/ETTm2.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'S' -ForecastDataset.horizon_len = 336 -ForecastDataset.lookback_mult = 7 diff --git a/experiments/configs/ETTm2/720M.gin b/experiments/configs/ETTm2/720M.gin deleted file mode 100644 index 6c503ae..0000000 --- a/experiments/configs/ETTm2/720M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ETTm2/720M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'ETT-small/ETTm2.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 720 -ForecastDataset.lookback_mult = 1 diff --git a/experiments/configs/ETTm2/720S.gin b/experiments/configs/ETTm2/720S.gin deleted file mode 100644 index 6d00c03..0000000 --- a/experiments/configs/ETTm2/720S.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ETTm2/720S' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'ETT-small/ETTm2.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'S' -ForecastDataset.horizon_len = 720 -ForecastDataset.lookback_mult = 1 diff --git a/experiments/configs/ETTm2/96M.gin b/experiments/configs/ETTm2/96M.gin deleted file mode 100644 index 109da1f..0000000 --- a/experiments/configs/ETTm2/96M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ETTm2/96M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'ETT-small/ETTm2.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 96 -ForecastDataset.lookback_mult = 7 diff --git a/experiments/configs/ETTm2/96S.gin b/experiments/configs/ETTm2/96S.gin deleted file mode 100644 index f75c6a5..0000000 --- a/experiments/configs/ETTm2/96S.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ETTm2/96S' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'ETT-small/ETTm2.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'S' -ForecastDataset.horizon_len = 96 -ForecastDataset.lookback_mult = 5 diff --git a/experiments/configs/Exchange/192M.gin b/experiments/configs/Exchange/192M.gin deleted file mode 100644 index 003e3a3..0000000 --- a/experiments/configs/Exchange/192M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Exchange/192M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'exchange_rate/exchange_rate.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 192 -ForecastDataset.lookback_mult = 5 diff --git a/experiments/configs/Exchange/192S.gin b/experiments/configs/Exchange/192S.gin deleted file mode 100644 index 81c6a16..0000000 --- a/experiments/configs/Exchange/192S.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Exchange/192S' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'exchange_rate/exchange_rate.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'S' -ForecastDataset.horizon_len = 192 -ForecastDataset.lookback_mult = 1 diff --git a/experiments/configs/Exchange/336M.gin b/experiments/configs/Exchange/336M.gin deleted file mode 100644 index b81a904..0000000 --- a/experiments/configs/Exchange/336M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Exchange/336M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'exchange_rate/exchange_rate.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 336 -ForecastDataset.lookback_mult = 7 diff --git a/experiments/configs/Exchange/336S.gin b/experiments/configs/Exchange/336S.gin deleted file mode 100644 index a1b3936..0000000 --- a/experiments/configs/Exchange/336S.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Exchange/336S' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'exchange_rate/exchange_rate.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'S' -ForecastDataset.horizon_len = 336 -ForecastDataset.lookback_mult = 7 diff --git a/experiments/configs/Exchange/720M.gin b/experiments/configs/Exchange/720M.gin deleted file mode 100644 index e757500..0000000 --- a/experiments/configs/Exchange/720M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Exchange/720M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'exchange_rate/exchange_rate.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 720 -ForecastDataset.lookback_mult = 3 diff --git a/experiments/configs/Exchange/720S.gin b/experiments/configs/Exchange/720S.gin deleted file mode 100644 index 2e115ff..0000000 --- a/experiments/configs/Exchange/720S.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Exchange/720S' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'exchange_rate/exchange_rate.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'S' -ForecastDataset.horizon_len = 720 -ForecastDataset.lookback_mult = 3 diff --git a/experiments/configs/Exchange/96M.gin b/experiments/configs/Exchange/96M.gin deleted file mode 100644 index 7164d1a..0000000 --- a/experiments/configs/Exchange/96M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Exchange/96M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'exchange_rate/exchange_rate.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 96 -ForecastDataset.lookback_mult = 1 diff --git a/experiments/configs/Exchange/96S.gin b/experiments/configs/Exchange/96S.gin deleted file mode 100644 index 7953181..0000000 --- a/experiments/configs/Exchange/96S.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Exchange/96S' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'exchange_rate/exchange_rate.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'S' -ForecastDataset.horizon_len = 96 -ForecastDataset.lookback_mult = 3 diff --git a/experiments/configs/ILI/24M.gin b/experiments/configs/ILI/24M.gin deleted file mode 100644 index 80d53c5..0000000 --- a/experiments/configs/ILI/24M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ILI/96M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'illness/national_illness.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 24 -ForecastDataset.lookback_mult = 9 diff --git a/experiments/configs/ILI/36M.gin b/experiments/configs/ILI/36M.gin deleted file mode 100644 index 46632ea..0000000 --- a/experiments/configs/ILI/36M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ILI/192M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'illness/national_illness.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 36 -ForecastDataset.lookback_mult = 7 diff --git a/experiments/configs/ILI/48M.gin b/experiments/configs/ILI/48M.gin deleted file mode 100644 index 2a41998..0000000 --- a/experiments/configs/ILI/48M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ILI/336M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'illness/national_illness.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 48 -ForecastDataset.lookback_mult = 5 diff --git a/experiments/configs/ILI/60M.gin b/experiments/configs/ILI/60M.gin deleted file mode 100644 index 45a06c4..0000000 --- a/experiments/configs/ILI/60M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'ILI/720M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'illness/national_illness.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 60 -ForecastDataset.lookback_mult = 3 diff --git a/experiments/configs/Stocks/96M2S.gin b/experiments/configs/Stocks/96M2S.gin index d142677..2e8cefe 100644 --- a/experiments/configs/Stocks/96M2S.gin +++ b/experiments/configs/Stocks/96M2S.gin @@ -23,15 +23,17 @@ Checkpoint.patience = 7 deeptime3.layer_size = 32 deeptime3.inr_layers = 5 -deeptime3.n_fourier_feats = 4096 +deeptime3.dropout = 0.3 +deeptime3.base_learner = 'Ridge' +deeptime3.n_fourier_feats = 2048 deeptime3.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] ForecastDataset.data_path = 'stocks/OXY_2019.csv.gz' ForecastDataset.target = 'RSMKs_18_144_72' ForecastDataset.scale = True ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] +ForecastDataset.time_features = 'h' ForecastDataset.normalise_time_features = True ForecastDataset.features = 'M2S' -ForecastDataset.horizon_len = 96 -ForecastDataset.lookback_mult = 1 +ForecastDataset.horizon_len = 46 +ForecastDataset.lookback_mult = 2 diff --git a/experiments/configs/Traffic/192M.gin b/experiments/configs/Traffic/192M.gin deleted file mode 100644 index 868f567..0000000 --- a/experiments/configs/Traffic/192M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Traffic/192M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'traffic/traffic.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 192 -ForecastDataset.lookback_mult = 5 diff --git a/experiments/configs/Traffic/336M.gin b/experiments/configs/Traffic/336M.gin deleted file mode 100644 index b186c4a..0000000 --- a/experiments/configs/Traffic/336M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Traffic/336M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'traffic/traffic.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 336 -ForecastDataset.lookback_mult = 5 diff --git a/experiments/configs/Traffic/720M.gin b/experiments/configs/Traffic/720M.gin deleted file mode 100644 index 6932c24..0000000 --- a/experiments/configs/Traffic/720M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Traffic/720M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'traffic/traffic.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 720 -ForecastDataset.lookback_mult = 3 diff --git a/experiments/configs/Traffic/96M.gin b/experiments/configs/Traffic/96M.gin deleted file mode 100644 index 5a6fa9e..0000000 --- a/experiments/configs/Traffic/96M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Traffic/96M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'traffic/traffic.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 96 -ForecastDataset.lookback_mult = 9 diff --git a/experiments/configs/Weather/192M.gin b/experiments/configs/Weather/192M.gin deleted file mode 100644 index d1dee6a..0000000 --- a/experiments/configs/Weather/192M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Weather/192M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'weather/weather.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 192 -ForecastDataset.lookback_mult = 7 diff --git a/experiments/configs/Weather/336M.gin b/experiments/configs/Weather/336M.gin deleted file mode 100644 index 69aceb8..0000000 --- a/experiments/configs/Weather/336M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Weather/336M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'weather/weather.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 192 -ForecastDataset.lookback_mult = 3 diff --git a/experiments/configs/Weather/720M.gin b/experiments/configs/Weather/720M.gin deleted file mode 100644 index 8d20cd8..0000000 --- a/experiments/configs/Weather/720M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Weather/720M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'weather/weather.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 720 -ForecastDataset.lookback_mult = 5 diff --git a/experiments/configs/Weather/96M.gin b/experiments/configs/Weather/96M.gin deleted file mode 100644 index 89048a4..0000000 --- a/experiments/configs/Weather/96M.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'Weather/96M' -build.module = 'experiments.forecast' -build.repeat = 1 -build.variables_dict = { -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'weather/weather.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True -ForecastDataset.features = 'M' -ForecastDataset.horizon_len = 96 -ForecastDataset.lookback_mult = 9 diff --git a/experiments/configs/hp_search/ECL.gin b/experiments/configs/hp_search/ECL.gin deleted file mode 100644 index 9872237..0000000 --- a/experiments/configs/hp_search/ECL.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'hp_search/ECL' -build.module = 'experiments.forecast' -build.repeat = 3 -build.variables_dict = { - 'ForecastDataset.lookback_mult': [1, 3, 5, 7, 9], - 'ForecastDataset.horizon_len': [96, 192, 336, 720], - 'ForecastDataset.features': ['M'], -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'electricity/electricity.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True diff --git a/experiments/configs/hp_search/ETTm2.gin b/experiments/configs/hp_search/ETTm2.gin deleted file mode 100644 index 9e2e56b..0000000 --- a/experiments/configs/hp_search/ETTm2.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'hp_search/ETTm2' -build.module = 'experiments.forecast' -build.repeat = 3 -build.variables_dict = { - 'ForecastDataset.lookback_mult': [1, 3, 5, 7, 9], - 'ForecastDataset.horizon_len': [96, 192, 336, 720], - 'ForecastDataset.features': ['M', 'S'], -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'ETT-small/ETTm2.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True diff --git a/experiments/configs/hp_search/Exchange.gin b/experiments/configs/hp_search/Exchange.gin deleted file mode 100644 index 394ce03..0000000 --- a/experiments/configs/hp_search/Exchange.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'hp_search/Exchange' -build.module = 'experiments.forecast' -build.repeat = 3 -build.variables_dict = { - 'ForecastDataset.lookback_mult': [1, 3, 5, 7, 9], - 'ForecastDataset.horizon_len': [96, 192, 336, 720], - 'ForecastDataset.features': ['M', 'S'], -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'exchange_rate/exchange_rate.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True diff --git a/experiments/configs/hp_search/ILI.gin b/experiments/configs/hp_search/ILI.gin deleted file mode 100644 index ded40fc..0000000 --- a/experiments/configs/hp_search/ILI.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'hp_search/ILI' -build.module = 'experiments.forecast' -build.repeat = 3 -build.variables_dict = { - 'ForecastDataset.lookback_mult': [1, 3, 5, 7, 9], - 'ForecastDataset.horizon_len': [24, 36, 48, 60], - 'ForecastDataset.features': ['M'], -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'illness/national_illness.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True diff --git a/experiments/configs/hp_search/Stocks.gin b/experiments/configs/hp_search/Stocks.gin new file mode 100644 index 0000000..c33d3ad --- /dev/null +++ b/experiments/configs/hp_search/Stocks.gin @@ -0,0 +1,47 @@ +build.experiment_name = 'Stocks/96M2S' +build.module = 'experiments.forecast' +build.repeat = 1 +build.variables_dict = { + # 'ForecastDataset.lookback_mult': [1, 3, 5, 7, 9], + # 'ForecastDataset.horizon_len': [6, 12, 24, 48, 96, 192, 336, 720], + # 'ForecastDataset.features': ['m', 'h', 'd'], + 'deeptime3.base_learner': ['Ridge', 'None', 'Transformer'], + 'deeptime3.inr': ['INR', 'INRPlus2'], + 'deeptime3.encoder': ['inception', ], + # 'deeptime3.dropout': [0.0, 0.1, 0.3, 0.5,], +} + +instance.model_type = 'deeptime3' +instance.save_vals = False + +get_optimizer.lr = 1e-3 +get_optimizer.lambda_lr = 1. +get_optimizer.weight_decay = 0. + +get_scheduler.warmup_epochs = 5 + +get_data.batch_size = 256 + +train.loss_name = 'mse' +train.epochs = 50 +train.clip = 10. + +Checkpoint.patience = 7 + +deeptime3.layer_size = 32 +deeptime3.inr_layers = 5 +deeptime3.dropout = 0.3 +deeptime3.base_learner = 'Ridge' +deeptime3.n_fourier_feats = 2048 +deeptime3.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] + +ForecastDataset.data_path = 'stocks/OXY_2019.csv.gz' +ForecastDataset.target = 'RSMKs_18_144_72' +ForecastDataset.scale = True +ForecastDataset.cross_learn = False +ForecastDataset.time_features = [] +# ForecastDataset.time_features = 'h' +ForecastDataset.normalise_time_features = True +ForecastDataset.features = 'M2S' +ForecastDataset.horizon_len = 46 +ForecastDataset.lookback_mult = 2 diff --git a/experiments/configs/hp_search/Traffic.gin b/experiments/configs/hp_search/Traffic.gin deleted file mode 100644 index dab204b..0000000 --- a/experiments/configs/hp_search/Traffic.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'hp_search/Traffic' -build.module = 'experiments.forecast' -build.repeat = 3 -build.variables_dict = { - 'ForecastDataset.lookback_mult': [1, 3, 5, 7, 9], - 'ForecastDataset.horizon_len': [96, 192, 336, 720], - 'ForecastDataset.features': ['M'], -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'traffic/traffic.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True diff --git a/experiments/configs/hp_search/Weather.gin b/experiments/configs/hp_search/Weather.gin deleted file mode 100644 index 00b1863..0000000 --- a/experiments/configs/hp_search/Weather.gin +++ /dev/null @@ -1,37 +0,0 @@ -build.experiment_name = 'hp_search/Weather' -build.module = 'experiments.forecast' -build.repeat = 3 -build.variables_dict = { - 'ForecastDataset.lookback_mult': [1, 3, 5, 7, 9], - 'ForecastDataset.horizon_len': [96, 192, 336, 720], - 'ForecastDataset.features': ['M'], -} - -instance.model_type = 'deeptime' -instance.save_vals = False - -get_optimizer.lr = 1e-3 -get_optimizer.lambda_lr = 1. -get_optimizer.weight_decay = 0. - -get_scheduler.warmup_epochs = 5 - -get_data.batch_size = 256 - -train.loss_name = 'mse' -train.epochs = 50 -train.clip = 10. - -Checkpoint.patience = 7 - -deeptime.layer_size = 256 -deeptime.inr_layers = 5 -deeptime.n_fourier_feats = 4096 -deeptime.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100] - -ForecastDataset.data_path = 'weather/weather.csv' -ForecastDataset.target = 'OT' -ForecastDataset.scale = True -ForecastDataset.cross_learn = False -ForecastDataset.time_features = [] -ForecastDataset.normalise_time_features = True diff --git a/mjc_notes.md b/mjc_notes.md index be810b0..576ba50 100644 --- a/mjc_notes.md +++ b/mjc_notes.md @@ -60,6 +60,20 @@ My mods (I added past other variables): Where INR is one of [mlp, lstm, lstm2, transformer, transforme2, inceptioncausal] TODO: -- M2S mode -- add other INR's -- add None as learner + +- [x] try just one predictor +- [x] compare multi +- losses: + - try logp? nah + - mae? +- [x] make my own csv with 5m data (maybe 10k rows) +- [ ] backtest? + +- [x] M2S mode +- [ ] add other INR's +- [ ] add None as learner + +``` +python -m experiments.forecast --config_path=experiments/configs/hp_search/Stocks.gin build_experiment +./run.sh +``` diff --git a/models/DeepTIMe3.py b/models/DeepTIMe3.py index deafa66..5c087a4 100644 --- a/models/DeepTIMe3.py +++ b/models/DeepTIMe3.py @@ -11,40 +11,54 @@ import torch.nn as nn from torch import Tensor from einops import rearrange, repeat, reduce -from models.modules.causalinception import CausalInceptionTimePlus, CausalConv1d +from models.modules.metareghead import RegressionHead +from models.modules.causalinception import CausalInceptionTimePlus from models.modules.inrplus2 import INRPlus2 -from models.modules.regressors import RidgeRegressor +from models.modules.inr import INR +from models.modules.encoders import LSTMEncoder, TransformerEncoder2, TransformerEncoder, InceptionEncoder, LSTMEncoder2, MLPEncoder +# from models.modules.regressors import RidgeRegressor @gin.configurable() -def deeptime3(dim_size:int, datetime_feats: int, layer_size: int, inr_layers: int, n_fourier_feats: int, scales: float): - return DeepTIMe3(dim_size, datetime_feats, layer_size, inr_layers, n_fourier_feats, scales) +def deeptime3(dim_size:int, datetime_feats: int, layer_size: int, inr_layers: int, n_fourier_feats: int, scales: float, dropout: float, base_learner: str, encoder:str, inr: str): + return DeepTIMe3(dim_size, datetime_feats, layer_size, inr_layers, n_fourier_feats, scales, dropout, base_learner, encoder, inr) class DeepTIMe3(nn.Module): - def __init__(self, dim_size: int, datetime_feats: int, layer_size: int, inr_layers: int, n_fourier_feats: int, scales: float, dropout: float=0.3): + def __init__(self, dim_size: int, datetime_feats: int, layer_size: int, inr_layers: int, n_fourier_feats: int, scales: float, dropout: float=0.3, base_learner:str='Ridge', encoder:str='inception', inr:str='INR'): super().__init__() # encode the past - encoded_size = layer_size//2 - self.encoder = CausalInceptionTimePlus( - c_in=dim_size, c_out=encoded_size, - # nf=32, depth=6, - nf=17, depth=3, - bn=True, - dilation=6, - ks=[39, 19, 3], - coord=True, fc_dropout=dropout, - ) + if encoder == 'inception': + encoded_size = layer_size + self.encoder = CausalInceptionTimePlus( + c_in=dim_size, c_out=encoded_size, + # nf=24, depth=4, + nf=17, depth=3, + bn=True, + dilation=2, + ks=[39, 19, 3], + coord=True, fc_dropout=dropout, + ) + elif encoder == 'lstm': + self.encoder = LSTMEncoder() + else: + raise NotADirectoryError(encoder) # translate coords to a representation, given a summary of the past coord_size = 1 in_feats=datetime_feats+encoded_size+coord_size - self.inr = INRPlus2(in_feats=in_feats, layers=inr_layers, layer_size=layer_size, + if inr=='INRPlus2': + self.inr = INRPlus2(in_feats=in_feats, layers=inr_layers, layer_size=layer_size, n_fourier_feats=n_fourier_feats, scales=scales, dropout=dropout) + elif inr=="INR": + self.inr = INR(in_feats=in_feats, layers=inr_layers, layer_size=layer_size, + n_fourier_feats=n_fourier_feats, scales=scales, dropout=dropout) + else: + raise NotImplementedError(inr) # meta learn y given a representation - self.adaptive_weights = RidgeRegressor() + self.regressionhead = RegressionHead(base_learner=base_learner, d=layer_size, dropout=dropout) self.datetime_feats = datetime_feats self.inr_layers = inr_layers @@ -78,8 +92,7 @@ class DeepTIMe3(nn.Module): context_reprs = self.encode_and_decode(context_past_x, context_time) query_reprs = self.encode_and_decode(query_past_x, query_time, offset=context_reprs.shape[1]) - w, b = self.adaptive_weights(context_reprs, context_y) - preds = self.forecast(query_reprs, w, b) + preds = self.regressionhead(query_reprs, context_reprs, context_y) return preds def forecast(self, inp: Tensor, w: Tensor, b: Tensor) -> Tensor: diff --git a/models/modules/encoders.py b/models/modules/encoders.py new file mode 100644 index 0000000..8d73f62 --- /dev/null +++ b/models/modules/encoders.py @@ -0,0 +1,272 @@ + +# import gin +import torch +import torch.nn as nn +from torch import Tensor +from einops import rearrange, repeat, reduce + +from tsai.models.InceptionTimePlus import ( + Conv, + noop, + nn, + LinBnDrop, + GAP1d, + torch, + AddCoords1d, BatchNorm +) +from tsai.models.TSTPlus import TSTPlus +from tsai.models.TSPerceiver import TSPerceiver +from tsai.models.TSSequencerPlus import TSSequencerPlus +from torch.nn.utils import weight_norm, spectral_norm +from .causalinception import CausalInceptionTimePlus +from .inr import INR + +def custom_head(head_nf, c_out, seq_len): + return nn.Sequential( + # AddCoords1d(), + # Conv(head_nf+1, head_nf, 2, bias=True, norm='Spectral'), + # nn.BatchNorm1d(head_nf), + # # nn.Dropout(0.15), + # nn.ReLU(), + AddCoords1d(), + Conv(head_nf + 1, c_out, 1, bias=False, norm="Spectral"), + ) + +class LinBnDropSN(nn.Sequential): + "Module grouping `BatchNorm1d`, `Dropout` and `Linear` layers" + def __init__(self, n_in, n_out, bn=True, p=0., act=None, lin_first=False, norm=None): + layers = [BatchNorm(n_out if lin_first else n_in, ndim=1)] if bn else [] + if p != 0: layers.append(nn.Dropout(p)) + lin = [spectral_norm(nn.Linear(n_in, n_out, bias=not bn))] + if act is not None: lin.append(act) + layers = lin+layers if lin_first else layers+lin + super().__init__(*layers) + + +class InceptionEncoder(nn.Module): + def __init__(self, c_in, c_out, *args, **kwargs): + super().__init__() + self.net = CausalInceptionTimePlus( + c_in=c_in, c_out=c_out, custom_head=custom_head, *args, **kwargs + ) + bn = kwargs.get("bn", True) + fc_dropout = kwargs.get("fc_dropout", 0.15) + self.pool = nn.Sequential( + # GACP1d(1), + # LinBnDrop(c_out*2, c_out, bn=bn, p=dropout) + GAP1d(1), + LinBnDropSN(c_out, c_out, bn=bn, p=fc_dropout), + ) + self.head = nn.Sequential( + # just to make sure we get a spectral norm final layer (after cat) + LinBnDropSN(c_out*2, c_out*2, bn=bn, p=fc_dropout), + ) + + def forward(self, x): + """ + Takes in a sequence of shape (batch, sequence, features) + and outputs a representation of shape (batch, features) + """ + outs = self.net(x.permute(0, 2, 1)) # .permute(0, 2, 1) + last = outs[:, :, -1] # take last + max = self.pool(outs) + return self.head(torch.cat([max, last], 1)) + + +class TransformerEncoder(nn.Module): + def __init__( + self, + c_in, + c_out, + seq_len, + layers=3, + layer_size=512, + dropout=0.1, + n_heads=4, + conv_dropout=0, + *args, + **kwargs, + ): + super().__init__() + # d_model (82) must be divisible by n_heads (4) + layer_size = layer_size // n_heads * n_heads + d_model = layer_size // 2 + self.net = TSTPlus( + c_in=c_in, + c_out=c_out, + seq_len=seq_len, + d_model=d_model, + n_heads=n_heads, + d_k=d_model // n_heads, + d_v=d_model // n_heads, + d_ff=layer_size, + n_layers=layers, + dropout=conv_dropout, + fc_dropout=dropout, + flatten=False, + # *args, **kwargs + ) + + def forward(self, x): + """ + Takes in a sequence of shape (batch, sequence, features) + and outputs a representation of shape (batch, features) + """ + outs = self.net(x.permute(0, 2, 1)) + return outs + + +class TransformerEncoder2(nn.Module): + def __init__( + self, + c_in, + c_out, + seq_len, + layers=3, + layer_size=512, + dropout=0.1, + n_heads=4, + conv_dropout=0, + *args, + **kwargs, + ): + super().__init__() + # d_model (82) must be divisible by n_heads (4) + layer_size = layer_size // n_heads * n_heads + d_model = layer_size // 2 + self.net = TSPerceiver( + c_in=c_in, + c_out=c_out, + seq_len=seq_len, + + # cat_szs=0, n_cont=0, + n_latents=layer_size, d_latent=layer_size//4, + # d_context=None, + self_per_cross_attn=1, + # share_weights=True, cross_n_heads=1, d_head=None, + + + # d_model=d_model, + # d_k=d_model // n_heads, + # d_v=d_model // n_heads, + # d_ff=layer_size, + + self_n_heads=n_heads, + n_layers=layers, + attn_dropout=conv_dropout, + fc_dropout=dropout, + ) + + def forward(self, x): + """ + Takes in a sequence of shape (batch, sequence, features) + and outputs a representation of shape (batch, features) + """ + outs = self.net(x.permute(0, 2, 1)) + return outs + + +class LSTMEncoder(nn.Module): + def __init__( + self, + c_in, + c_out, + dropout=0.1, + conv_dropout=0, + layers=1, + layer_size=100, + *args, + **kwargs, + ): + super().__init__() + self.rnn = nn.LSTM( + c_in, + layer_size, + num_layers=layers, + bias=True, + batch_first=True, + dropout=conv_dropout, + bidirectional=False, + ) + self.dropout = nn.Dropout(dropout) if dropout else noop + self.fc = nn.Linear(layer_size * (1 + 0), c_out) + + def forward(self, x): + """ + Takes in a sequence of shape (batch, sequence, features) + and outputs a representation of shape (batch, features) + """ + # x = x.transpose(2,1) # [batch_size x n_vars x seq_len] --> [batch_size x seq_len x n_vars] + output, _ = self.rnn( + x + ) # output from all sequence steps: [batch_size x seq_len x hidden_size * (1 + bidirectional)] + output = output[ + :, -1 + ] # output from last sequence step : [batch_size x hidden_size * (1 + bidirectional)] + return self.fc(self.dropout(output)) + + + +class LSTMEncoder2(nn.Module): + def __init__( + self, + c_in, + c_out, + seq_len, + dropout=0.1, + conv_dropout=0, + layers=1, + layer_size=100, + *args, + **kwargs, + ): + super().__init__() + self.rnn = TSSequencerPlus( + c_in=c_in, + c_out=c_out, + seq_len=seq_len, + d_model=layer_size, + depth=layers, + lstm_dropout=conv_dropout, + fc_dropout=dropout, + pre_norm=False, use_token=True, use_pe=True, + use_bn=False, + ) + + def forward(self, x): + """ + Takes in a sequence of shape (batch, sequence, features) + and outputs a representation of shape (batch, features) + """ + return self.rnn( + x.transpose(2, 1) + ) + + +class MLPEncoder(nn.Module): + def __init__( + self, + c_in, + c_out, + scales=[0.01, 0.1, 1, 5, 10, 20, 50, 100], + n_fourier_feats=4096, + layers=2, + layer_size=32, + *args, + **kwargs, + ): + super().__init__() + self.net = INR( + in_feats=c_in, + scales=scales, + n_fourier_feats=n_fourier_feats, + layers=layers, + layer_size=layer_size, + ) + + def forward(self, x): + """ + Takes in a sequence of shape (batch, sequence, features) + and outputs a representation of shape (batch, features) + """ + return self.net(x)[:, -1] diff --git a/models/modules/metareghead.py b/models/modules/metareghead.py new file mode 100644 index 0000000..234d1b5 --- /dev/null +++ b/models/modules/metareghead.py @@ -0,0 +1,79 @@ + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from models.modules.regressors import RidgeRegressor +from models.modules.inr import INR, INRLayer + +class SumHead(nn.Module): + def __init__(self, d, c_out=1, ): + super().__init__() + self.l = nn.Linear(d, c_out) # init a random transform + + def forward(self, query, support, support_labels): + return self.l(query) + + +class TransformerHead(nn.Module): + def __init__(self, d, c_out=1, dropout=0.1, num_heads=16): + super().__init__() + if d<64: + num_heads = 4 + d = d//num_heads*num_heads # make sure it's divisable + hidden_dim = d//4 + # the value is just one class, so let's embed it first + self.value_encoder = nn.Sequential( + INRLayer(c_out, hidden_dim, dropout=0), + nn.Linear(hidden_dim, hidden_dim) + ) + self.l = nn.MultiheadAttention(embed_dim=d, num_heads=num_heads, batch_first=True, kdim=d, vdim=hidden_dim, add_bias_kv=True, bias=True) + # after using attention let's decode it + self.decoder = nn.Sequential( + INRLayer(d, d, dropout=dropout), + nn.Linear(d, c_out) + ) + + def forward(self, query, support, support_labels, *args, **kwargs): + """ + Fits the support set with ridge regression and + returns the classification score on the query set. + + Parameters: + query: a (tasks_per_batch, n_query, d) Tensor. + support: a (tasks_per_batch, n_support, d) Tensor. + support_labels: a (tasks_per_batch, n_support) Tensor. + n_way: a scalar. Represents the number of classes in a few-shot classification task. + n_shot: a scalar. Represents the number of support examples given per class. + lambda_reg: a scalar. Represents the strength of L2 regularization. + Returns: a (tasks_per_batch, n_query, n_way) Tensor. + """ + # should be (batch, seq, feature) + value = self.value_encoder(support_labels) + attn_output, _ = self.l(query=query, key=support, value=value) + o = self.decoder(attn_output) + return o + + +class RegressionHead(nn.Module): + def __init__(self, base_learner='Ridge', d=512, enable_scale=True, dropout=0.1, num_heads=16): + super().__init__() + if ('Ridge' in base_learner): + # the regular DeepTime one + self.head = RidgeRegressor() + elif ("None" in base_learner): + self.head = SumHead(d=d) + elif ("Transformer" in base_learner): + self.head = TransformerHead(d=d, dropout=dropout, num_heads=num_heads) + else: + raise NotImplementedError(base_learner) + + # Add a learnable scale + self.enable_scale = enable_scale + self.scale = nn.Parameter(torch.FloatTensor([1.0])) + + def forward(self, query, support, support_labels, **kwargs): + if self.enable_scale: + return self.scale * self.head(query, support, support_labels, **kwargs) + else: + return self.head(query, support, support_labels, **kwargs) diff --git a/models/modules/regressors.py b/models/modules/regressors.py index 311c895..0e4565d 100644 --- a/models/modules/regressors.py +++ b/models/modules/regressors.py @@ -9,6 +9,7 @@ import torch from torch import Tensor from torch import nn import torch.nn.functional as F +from einops import rearrange, repeat, reduce class RidgeRegressor(nn.Module): @@ -16,11 +17,15 @@ class RidgeRegressor(nn.Module): super().__init__() self._lambda = nn.Parameter(torch.as_tensor(lambda_init, dtype=torch.float)) - def forward(self, reprs: Tensor, x: Tensor, reg_coeff: Optional[float] = None) -> Tensor: + def forward(self, query_reprs:Tensor, context_reprs: Tensor, context_y: Tensor, reg_coeff: Optional[float] = None) -> Tensor: if reg_coeff is None: reg_coeff = self.reg_coeff() - w, b = self.get_weights(reprs, x, reg_coeff) - return w, b + w, b = self.get_weights(context_reprs, context_y, reg_coeff) + preds = self.forecast(query_reprs, w, b) + return preds + + def forecast(self, inp: Tensor, w: Tensor, b: Tensor) -> Tensor: + return torch.einsum('... d o, ... t d -> ... t o', [w, inp]) + b def get_weights(self, X: Tensor, Y: Tensor, reg_coeff: float) -> Tensor: batch_size, n_samples, n_dim = X.shape diff --git a/run.sh b/run.sh index 71d378e..2f0f0e3 100755 --- a/run.sh +++ b/run.sh @@ -1,4 +1,5 @@ -for dataset in ECL ETTm2 Exchange ILI Traffic Weather Stocks; do +set -x +for dataset in Stocks; do for instance in `/bin/ls -d storage/experiments/$dataset/*/*`; do echo $instance make run command=${instance}/command diff --git a/scratch-run_exp.ipynb b/scratch-run_exp.ipynb index dcc04a0..ec29b6c 100644 --- a/scratch-run_exp.ipynb +++ b/scratch-run_exp.ipynb @@ -21,8 +21,8 @@ "id": "7f9e3d73", "metadata": { "ExecuteTime": { - "end_time": "2022-11-22T08:53:36.551710Z", - "start_time": "2022-11-22T08:53:36.541855Z" + "end_time": "2022-11-22T13:17:16.252902Z", + "start_time": "2022-11-22T13:17:16.244846Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "4e09086b", "metadata": { "ExecuteTime": { - "end_time": "2022-11-22T08:53:37.734688Z", - "start_time": "2022-11-22T08:53:36.553157Z" + "end_time": "2022-11-22T13:17:17.421370Z", + "start_time": "2022-11-22T13:17:16.254109Z" }, "lines_to_next_cell": 0 }, @@ -101,15 +101,26 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 19, "id": "04499bef", "metadata": { "ExecuteTime": { - "end_time": "2022-11-22T08:55:17.435474Z", - "start_time": "2022-11-22T08:55:17.366558Z" + "end_time": "2022-11-22T13:20:49.179263Z", + "start_time": "2022-11-22T13:20:49.094704Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\n", "\n", @@ -160,12 +171,39 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, + "id": "06a196e5", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T13:28:35.849491Z", + "start_time": "2022-11-22T13:28:35.766453Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "442614f6", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T13:29:32.186666Z", + "start_time": "2022-11-22T13:29:32.108212Z" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 135, "id": "768530be", "metadata": { "ExecuteTime": { - "end_time": "2022-11-22T08:57:21.879818Z", - "start_time": "2022-11-22T08:57:21.861767Z" + "end_time": "2022-11-22T13:40:23.550516Z", + "start_time": "2022-11-22T13:40:23.526514Z" } }, "outputs": [], @@ -173,6 +211,7 @@ "\n", "\n", "def plot_multi(save_paths=[Path(\"storage/experiments/Exchange/96M/repeat=0\")], i=200, title=None, plot=True):\n", + " assert len(save_paths)>0\n", " for j in range(len(save_paths)):\n", " save_path = save_paths[j]\n", "\n", @@ -210,12 +249,19 @@ " i_future = list(range(l, l+l2))\n", "\n", " if plot:\n", - " plt.plot(i_past, x2[:, 0], c=colors[0], label=f\"past\")\n", - " plt.plot(i_future, y2[:, 0], c=colors[0], label=\"future true\", alpha=0.3)\n", " \n", - " mtitle = str(save_path).split('/')[-2:-1]\n", + " mtitle = str(save_path).split('/')[-2:]\n", + " \n", + " tags = mtitle[-1]\n", + " tags = [x.split('=')[-1] for x in tags.split(',')]\n", + " \n", + " mtitle[-1] = ' '.join(tags)\n", " mtitle = \"-\".join(mtitle)\n", " plt.plot(i_future, forecast2[:, 0], c=colors[j], linestyle='--', label=f\"{mtitle}\")\n", + " \n", + " if plot:\n", + " plt.plot(i_past, x2[:, 0], c=colors[0], label=f\"past\")\n", + " plt.plot(i_future, y2[:, 0], c=colors[0], label=\"future true\", alpha=0.3)\n", " plt.legend()\n", " plt.title(title)\n", " return x2, y2, forecast2, i_past, i_future\n" @@ -223,37 +269,33 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "739ee5e3", + "execution_count": null, + "id": "85eb0a18", "metadata": { "ExecuteTime": { - "end_time": "2022-11-22T08:56:04.650373Z", - "start_time": "2022-11-22T08:56:04.631636Z" + "end_time": "2022-11-22T13:38:15.786656Z", + "start_time": "2022-11-22T13:38:15.303577Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[Path('storage/experiments/Stocks/96M/repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96M2S/repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96S/repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96Splus/repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96Splusshort/repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96Sshort/repeat=0/_SUCCESS')]\n" - ] - } - ], + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "2c7f4971", + "metadata": {}, "source": [ - "# list the models we have run...\n", - "m=sorted(Path(\"storage/experiments/Stocks\").glob(\"**/_SUCCESS\"))\n", - "print(m)" + "# run exp" ] }, { "cell_type": "code", - "execution_count": 14, - "id": "346138b5", + "execution_count": 91, + "id": "6e876b82", "metadata": { "ExecuteTime": { - "end_time": "2022-11-22T08:55:45.864858Z", - "start_time": "2022-11-22T08:55:45.851119Z" + "end_time": "2022-11-22T13:32:31.609545Z", + "start_time": "2022-11-22T13:32:31.593738Z" } }, "outputs": [], @@ -263,24 +305,26 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "4350db4f", + "execution_count": 92, + "id": "4c40cef9", "metadata": { "ExecuteTime": { - "end_time": "2022-11-22T08:55:46.474714Z", - "start_time": "2022-11-22T08:55:46.454494Z" + "end_time": "2022-11-22T13:32:31.880691Z", + "start_time": "2022-11-22T13:32:31.848245Z" } }, "outputs": [ { - "data": { - "text/plain": [ - "'deeptime3'" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: 'storage/experiments/Stocks/96M2S/repeat=0/config.gin'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn [92], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m gin\u001b[38;5;241m.\u001b[39mclear_config()\n\u001b[1;32m 2\u001b[0m config_path \u001b[38;5;241m=\u001b[39m save_path\u001b[38;5;241m/\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mconfig.gin\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m----> 3\u001b[0m gin\u001b[38;5;241m.\u001b[39mparse_config(\u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mconfig_path\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 4\u001b[0m model_name \u001b[38;5;241m=\u001b[39m gin\u001b[38;5;241m.\u001b[39mquery_parameter(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124minstance.model_type\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 5\u001b[0m model_name\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/IPython/core/interactiveshell.py:282\u001b[0m, in \u001b[0;36m_modified_open\u001b[0;34m(file, *args, **kwargs)\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m file \u001b[38;5;129;01min\u001b[39;00m {\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m}:\n\u001b[1;32m 276\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 277\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIPython won\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt let you open fd=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfile\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m by default \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 278\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mas it is likely to crash IPython. If you know what you are doing, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 279\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124myou can use builtins\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m open.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 280\u001b[0m )\n\u001b[0;32m--> 282\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mio_open\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'storage/experiments/Stocks/96M2S/repeat=0/config.gin'" + ] } ], "source": [ @@ -293,24 +337,34 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "f2b73437", + "execution_count": 93, + "id": "fb3e6e3f", "metadata": { "ExecuteTime": { - "end_time": "2022-11-22T08:55:47.115689Z", - "start_time": "2022-11-22T08:55:47.090582Z" + "end_time": "2022-11-22T13:32:32.188870Z", + "start_time": "2022-11-22T13:32:32.152703Z" } }, "outputs": [ { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR:root:Path not found: storage/experiments/Stocks/96M2S/repeat=0/config.gin\n" + ] + }, + { + "ename": "OSError", + "evalue": "Unable to open file: storage/experiments/Stocks/96M2S/repeat=0/config.gin. Searched config paths: [''].", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn [93], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mexperiments\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mforecast\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ForecastExperiment\n\u001b[0;32m----> 2\u001b[0m exp \u001b[38;5;241m=\u001b[39m \u001b[43mForecastExperiment\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig_path\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m exp\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/investing/DeepTime/experiments/base.py:24\u001b[0m, in \u001b[0;36mExperiment.__init__\u001b[0;34m(self, config_path)\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig_path \u001b[38;5;241m=\u001b[39m config_path\n\u001b[1;32m 23\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mroot \u001b[38;5;241m=\u001b[39m Path(config_path)\u001b[38;5;241m.\u001b[39mparent\n\u001b[0;32m---> 24\u001b[0m \u001b[43mgin\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse_config_file\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig_path\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/config.py:2457\u001b[0m, in \u001b[0;36mparse_config_file\u001b[0;34m(config_file, skip_unknown, print_includes_and_imports)\u001b[0m\n\u001b[1;32m 2455\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m results\n\u001b[1;32m 2456\u001b[0m err_str \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mUnable to open file: \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m. Searched config paths: \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m-> 2457\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mIOError\u001b[39;00m(err_str\u001b[38;5;241m.\u001b[39mformat(config_file, prefixes))\n", + "\u001b[0;31mOSError\u001b[0m: Unable to open file: storage/experiments/Stocks/96M2S/repeat=0/config.gin. Searched config paths: ['']." + ] } ], "source": [ @@ -321,12 +375,12 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "6e8d5627", + "execution_count": 94, + "id": "2b97837c", "metadata": { "ExecuteTime": { - "end_time": "2022-11-22T08:56:09.770735Z", - "start_time": "2022-11-22T08:56:09.752888Z" + "end_time": "2022-11-22T13:32:32.294346Z", + "start_time": "2022-11-22T13:32:32.275437Z" } }, "outputs": [], @@ -334,14 +388,22 @@ "# exp.run()" ] }, + { + "cell_type": "markdown", + "id": "564a891e", + "metadata": {}, + "source": [ + "# view all" + ] + }, { "cell_type": "code", - "execution_count": 29, - "id": "5623579b", + "execution_count": 151, + "id": "739ee5e3", "metadata": { "ExecuteTime": { - "end_time": "2022-11-22T08:58:27.954931Z", - "start_time": "2022-11-22T08:58:27.717272Z" + "end_time": "2022-11-22T13:48:14.546039Z", + "start_time": "2022-11-22T13:48:13.703677Z" } }, "outputs": [ @@ -349,14 +411,81 @@ "name": "stdout", "output_type": "stream", "text": [ - "receptive field [114 342 362]=[38 18 2]*[[ 1 1 1]\n", - " [ 1 6 36]\n", - " [ 1 12 144]]\n", + "[Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INR,encoder=inception,repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INRPlus2,encoder=inception,repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INR,encoder=inception,repeat=0/_SUCCESS')]\n" + ] + } + ], + "source": [ + "# list the models we have run...\n", + "m=sorted(Path(\"storage/experiments/Stocks\").glob(\"**/_SUCCESS\"))\n", + "print(m)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "id": "95be3adb", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T13:48:15.238855Z", + "start_time": "2022-11-22T13:48:15.223681Z" + } + }, + "outputs": [], + "source": [ + "# m = [\n", + "# # Path('storage/experiments/Stocks/96M/repeat=0/_SUCCESS'),\n", + "# Path(\n", + "# 'storage/experiments/Stocks/96M2S/base_learner=None,inr=INRPlus2,encoder=inception,repeat=0/_SUCCESS'\n", + "# ),\n", + "# Path(\n", + "# 'storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INR,encoder=inception,repeat=0/_SUCCESS'\n", + "# ),\n", + "# Path(\n", + "# 'storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INRPlus2,encoder=inception,repeat=0/_SUCCESS'\n", + "# ),\n", + "# Path(\n", + "# 'storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INR,encoder=inception,repeat=0/_SUCCESS'\n", + "# ),\n", + "# Path(\n", + "# 'storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INRPlus2,encoder=inception,repeat=0/_SUCCESS'\n", + "# ),\n", + "# # Path('storage/experiments/Stocks/96S/repeat=0/_SUCCESS'),\n", + "# # Path('storage/experiments/Stocks/96Splus/repeat=0/_SUCCESS'),\n", + "# # Path('storage/experiments/Stocks/96Splusshort/repeat=0/_SUCCESS'),\n", + "# # Path('storage/experiments/Stocks/96Sshort/repeat=0/_SUCCESS')\n", + "# ]" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "id": "5a558fc3", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T13:48:16.061250Z", + "start_time": "2022-11-22T13:48:15.395935Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "receptive field [114 126 42]=[38 18 2]*[[ 1 1 1]\n", + " [ 1 2 4]\n", + " [ 1 4 16]]\n", + "receptive field [114 126 42]=[38 18 2]*[[ 1 1 1]\n", + " [ 1 2 4]\n", + " [ 1 4 16]]\n", "receptive field [690 378 242]=[138 18 2]*[[ 1 1 1]\n", " [ 1 2 4]\n", " [ 1 4 16]\n", " [ 1 6 36]\n", - " [ 1 8 64]]\n" + " [ 1 8 64]]\n", + "receptive field [114 126 42]=[38 18 2]*[[ 1 1 1]\n", + " [ 1 2 4]\n", + " [ 1 4 16]]\n" ] }, { @@ -365,13 +494,13 @@ "1" ] }, - "execution_count": 29, + "execution_count": 153, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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OOvnHjt2jIEDBxIQEMBnn31GvXr1Koztrrvu4q233mL9+vVs3bqVhQsXXtiFiog40O7d8PPPUFAAQUFw5ZUQGursqMSRHNpYd/jwYYqLiwkLCyu3PywsjO3bt1d4zu7du1m+fDkjRoxg8eLF7Nq1i7/85S8UFhYybdq0M46fPn06Tz/99EXHWpX+WUcdW/n39Mff35/ff/+db7/9lpdeeglvb2969epFUlJSuWN37NhBixYtKnyfO++8kxkzZjBs2DAaNmxY4TE5OTnEx8fj4+PDF198UalBvtHR0dSvX5/cCxmcJCLiIMXFZnzO/yaw0qwZdO2qauV1Qa3rmbTb7TRp0oR//etfeHp60qNHDw4cOMDLL79cYbIzZcoUEhISSrdzcnJKZxi5m2+//RbLsmjfvj27du3i4YcfpkOHDowZMwaAhx9+mGHDhnHllVdyzTXXsGTJEr788ktWrFhR4fvFxMRw+PBh6tevX+HrOTk5DBgwgLy8PN5///1yLWehoaF4enry1FNPkZeXx3XXXUeLFi04evQos2bNorCwkD/84Q8O+XMQEamq3Fz45Rc4dgxsNujY0dS4krrBoclOSEgInp6eZGRklNufkZFBeHh4hedERERQr149PE9JtWNiYkhPT6egoABvb+9yx/v4+ODj41P9wddC2dnZTJkyhf3799OoUSOGDh3Kc889V9qtdPPNNzNnzhymT5/OfffdR/v27fn3v//NFVdccdb3bNy48VlfW79+PatXrwagzWmd2SkpKaXjqWbPns3IkSPJyMigYcOGdO/enf/85z+0b9++Gq5aROTipKXBhg1QVAQ+PmYQcqNGzo5KapJDkx1vb2969OjBsmXLGDJkCGBabpYtW8akSZMqPOfyyy/nww8/xG634/G/krI7duwgIiLijESnrrn11lu59dZbz3nMnXfeec7Bxnv27Dnn+UePHi19fvXVV3O+ZZiuueYarrnmmnMeIyLiDJYF27ZBcrLZbtTIrIasJbfqHofPxkpISODNN99k/vz5bNu2jXvuuYfc3NzSrpeRI0cyZcqU0uPvuecesrKyuP/++9mxYwdff/01zz//PBMnTnR0qCIi4iby803Zh5JEp3Vr6NtXiU5d5fAxO8OGDePQoUNMnTqV9PR0YmNjWbJkSemg5dTU1NIWHDClDL799lseeOABunbtStOmTbn/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CFlZprWmogKe//wnvPJK2fPGjWs2PhFxLCU7IuLWiovLppq3aVN+qnlBAdx9N0yYYLqvJkwwZSFExL0o2RERt7Z7N5w4Yaaan7768erVsGCBGb8zfTr84x/OiVFEHOscNX5FRFzbqVPNO3Y8c9Bxv36wZYspCKriniLuS8mOiLit7dtNN1bDhhVPNQdT7fxcFc9FxPWpG0tE3NLRo2VTzTt1KttvWWbm1TffOCUsEXECteyIiFvassX8bNasbKp5URFMmmRmXJUcc7ZCoCLiPpTsiIjbOXDgzKnmJ07A0KGmRcdmM2vpKNERqRuU7IiIWykuhm3bzPM2bcwsLIC//tUkOn5+8NFHcNNNzotRRGqWxuyIiFtJTjatOH5+ZVPNU1LKFg187z0lOiJ1jZIdEXEbJ07Arl3m+alTzR95BPLzzfTyW25xXnwi4hxKdkTEbWzdarqxGjWCyEizz26HVq1MS89rr51ZAFRE3J+SHRFxC0eOmBpYNht06VK238MDXnwR9u8vv19E6g4lOyLi8iyrrKp58+YQEACPP162ejKY1h4RqZuU7IiIy0tNhZwcqFcPOnSAn34yta7+9CfTrSUidZtDk52srCxGjBhBYGAgwcHBjB07luPHj5/z+HvvvZf27dvj5+dH8+bNue+++8jOznZkmCLiwgoLTVkIgPbtwdsbXn3VbF9yyZn1sESk7nFosjNixAi2bNnC0qVL+eqrr/jhhx8YP378WY8/ePAgBw8eZMaMGWzevJl58+axZMkSxo4d68gwRcSF7dgBBQWm6yo62szGWrTIvPbww86MTERqC5tlWZYj3njbtm107NiRX375hZ49ewKwZMkSrrvuOvbv309kyVSJ8/j444/585//TG5uLl5e518DMScnh6CgILKzswkMDLyoaxCR2u34cVixwozZufRSCA015SBmz4brroOvv3Z2hCJSWY78/nZYy05iYiLBwcGliQ5AXFwcHh4erF69utLvU3LRZ0t08vPzycnJKfcQkbphyxaT6ISHm0QnKwveece89uCDzo1NRGoPhyU76enpNGnSpNw+Ly8vGjVqRHp6eqXe4/Dhwzz77LPn7PqaPn06QUFBpY+oqKiLiltEXENmpnl4eJgFBC0LJkyAvDyIjYVrrnF2hCJSW1Q52Xnsscew2WznfGwvGS14EXJychg8eDAdO3bkqaee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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -381,12 +510,10 @@ } ], "source": [ + "save_paths = [mm.parent for mm in m]\n", "plot_multi(\n", - " save_paths=[\n", - " save_path,\n", - "# Path('storage/experiments/Stocks/96M/repeat=0'),\n", - " ],\n", - " i=100,\n", + " save_paths=save_paths,\n", + " i=1000,\n", ")\n", "1" ] @@ -394,10 +521,129 @@ { "cell_type": "code", "execution_count": null, - "id": "c95b4880", - "metadata": {}, + "id": "5c5dc852", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T12:08:05.811964Z", + "start_time": "2022-11-22T12:07:40.797468Z" + } + }, "outputs": [], "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71995595", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T13:17:31.585029Z", + "start_time": "2022-11-22T13:17:31.528806Z" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "52fac522", + "metadata": {}, + "source": [ + "# check positions in dl" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "id": "00715926", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T13:41:08.258955Z", + "start_time": "2022-11-22T13:41:08.185519Z" + }, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(92, 5), (46, 1), (92, 5), (46, 1), (46, 7), (46, 7)]\n" + ] + } + ], + "source": [ + "train_set, train_loader = get_data(flag='test', batch_size=3)\n", + "b = context_past_x, context_y, query_past_x, query_y, context_time, query_time = train_set[100]\n", + "print([bb.shape for bb in b])\n", + "# context_y, query_y" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "6c7e008f", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T13:31:53.654372Z", + "start_time": "2022-11-22T13:31:53.638605Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(100, 192, 192, 238, 146, 238, 238, 284)" + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cx_start, cx_end, c_start, c_end, qx_start, qx_end, q_start, q_end = train_set.get_inds(100)\n", + "cx_start, cx_end, c_start, c_end, qx_start, qx_end, q_start, q_end" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "6d2f9c5f", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T13:31:53.744404Z", + "start_time": "2022-11-22T13:31:53.655231Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAiv0lEQVR4nO3de3CU1cHH8d8isOGSXQiQC2ShURguQripEJwBKghkMkiqM7WUmWALtGhQEGudOJVWtG8YKV46VS5VxNZGKijBIogRJJQSKAEyArYZsEBEktCq7IYASyDn/cNh25XcNoGc7Ob7mdkZ99nz7J4zT5b9unmy6zDGGAEAAFjSxvYEAABA60aMAAAAq4gRAABgFTECAACsIkYAAIBVxAgAALCKGAEAAFYRIwAAwKq2tifQENXV1Tp9+rSio6PlcDhsTwcAADSAMUYVFRXq2bOn2rSp/f2PsIiR06dPy+Px2J4GAABohM8//1yJiYm13h4WMRIdHS3pm8W4XC7LswEAAA3h8/nk8XgCr+O1CYsYufqrGZfLRYwAABBm6jvFghNYAQCAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVU2KkSVLlsjhcGjBggV1jlu3bp0GDBigqKgoDRkyRJs3b27KwwIAgAjS6BjZt2+fVq5cqeTk5DrH7d69W9OnT9esWbN08OBBpaenKz09XYcPH27sQwMAgAjiMMaYUHc6d+6cRowYoVdeeUXPPvushg0bphdffLHGsffff78qKyu1adOmwLbRo0dr2LBhWrFiRYMez+fzye12y+v18t00ANDCnL902fYU0EQd29+Yr6pr6Ot3ox49MzNTaWlpmjhxop599tk6xxYUFGjhwoVB2yZPnqzc3Nxa9/H7/fL7/YHrPp+vMdMEADSDQYu22p4CmujEkjSrjx9yjKxdu1YHDhzQvn37GjS+rKxMcXFxQdvi4uJUVlZW6z7Z2dl6+umnQ50aAAAIQyHFyOeff6758+crLy9PUVFRN2pOysrKCno3xefzyePx3LDHAwA03qeLJ9ueAsJcSDGyf/9+nTlzRiNGjAhsu3Llinbu3Knf/e538vv9uummm4L2iY+PV3l5edC28vJyxcfH1/o4TqdTTqczlKkBACy5UecboPUI6a9pJkyYoEOHDqmoqChwue222zRjxgwVFRVdEyKSlJKSom3btgVty8vLU0pKStNmDgAAIkJIORsdHa3BgwcHbevUqZO6desW2J6RkaFevXopOztbkjR//nyNGzdOy5YtU1pamtauXavCwkKtWrXqOi0BAACEs+v+CawlJSUqLS0NXB8zZoxycnK0atUqDR06VOvXr1dubu41UQMAAFqnRn3OSHPjc0YAAAg/DX395rtpAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFgVUowsX75cycnJcrlccrlcSklJ0ZYtW2odv2bNGjkcjqBLVFRUkycNAAAiR9tQBicmJmrJkiXq16+fjDF64403NG3aNB08eFC33nprjfu4XC4VFxcHrjscjqbNGAAARJSQYmTq1KlB13/9619r+fLl2rNnT60x4nA4FB8f3/gZAgCAiNboc0auXLmitWvXqrKyUikpKbWOO3funPr06SOPx6Np06bpyJEj9d633++Xz+cLugAAgMgUcowcOnRInTt3ltPp1Ny5c7VhwwYNGjSoxrH9+/fX6tWrtXHjRr355puqrq7WmDFjdOrUqTofIzs7W263O3DxeDyhThMAAIQJhzHGhLLDpUuXVFJSIq/Xq/Xr1+vVV19Vfn5+rUHyv6qqqjRw4EBNnz5dzzzzTK3j/H6//H5/4LrP55PH45HX65XL5QplugAAwBKfzye3213v63dI54xIUvv27dW3b19J0siRI7Vv3z699NJLWrlyZb37tmvXTsOHD9exY8fqHOd0OuV0OkOdGgAACENN/pyR6urqoHcx6nLlyhUdOnRICQkJTX1YAAAQIUJ6ZyQrK0upqanq3bu3KioqlJOTox07dmjr1q2SpIyMDPXq1UvZ2dmSpMWLF2v06NHq27evzp49q6VLl+rkyZOaPXv29V8JAAAISyHFyJkzZ5SRkaHS0lK53W4lJydr69atuvvuuyVJJSUlatPmv2+2fP3115ozZ47KysrUtWtXjRw5Urt3727Q+SUAAKB1CPkEVhsaegIMAABoORr6+s130wAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwKqQYWb58uZKTk+VyueRyuZSSkqItW7bUuc+6des0YMAARUVFaciQIdq8eXOTJgwAACJLSDGSmJioJUuWaP/+/SosLNRdd92ladOm6ciRIzWO3717t6ZPn65Zs2bp4MGDSk9PV3p6ug4fPnxdJg8AAMKfwxhjmnIHMTExWrp0qWbNmnXNbffff78qKyu1adOmwLbRo0dr2LBhWrFiRYMfw+fzye12y+v1yuVyNWW6iEDnL122PQWgVevYvq3tKaCFaujrd6N/gq5cuaJ169apsrJSKSkpNY4pKCjQwoULg7ZNnjxZubm5dd633++X3+8PXPf5fI2dJlqBQYu22p4C0KqdWJJmewoIcyGfwHro0CF17txZTqdTc+fO1YYNGzRo0KAax5aVlSkuLi5oW1xcnMrKyup8jOzsbLnd7sDF4/GEOk0AABAmQn5npH///ioqKpLX69X69es1c+ZM5efn1xokjZGVlRX0jorP5yNIUKtPF0+2PQUAQBOEHCPt27dX3759JUkjR47Uvn379NJLL2nlypXXjI2Pj1d5eXnQtvLycsXHx9f5GE6nU06nM9SpoZXi99UAEN6a/Dkj1dXVQed3/K+UlBRt27YtaFteXl6t55gAAIDWJ6T/pczKylJqaqp69+6tiooK5eTkaMeOHdq69ZsTCDMyMtSrVy9lZ2dLkubPn69x48Zp2bJlSktL09q1a1VYWKhVq1Zd/5UAAICwFFKMnDlz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LYfzcb76q4iYmBhJ0v79+1VVVRX0nB4wYIB69+4d9JweMmSI4uLiAmMmT54sn8+nI0eONOPsG+fba65tjMvlUtu2wV85lpmZqe7du+uOO+7Q6tWr6/0q95aktnX/6U9/Uvfu3TV48GBlZWXp/Pnzgdsi/Vjv379fRUVFNT6vw/lYh8UX5V1PZWVlkhT0g3r1+tXbysrKFBsbG3R727ZtFRMTExgTzi5evKgnnnhC06dPD/qypUceeUQjRoxQTEyMdu/eraysLJWWlur555+3ONvGmzJliu69914lJSXps88+05NPPqnU1FQVFBTopptuivjj/MYbbyg6Ojro1xVSeB/n6upqLViwQHfeeacGDx4s6Zvna/v27a8J628/p2t6zl+9rSWrac3f9p///EfPPPPMNb9iXLx4se666y517NhRH374oR566CGdO3dOjzzySHNMvUlqW/cPf/hD9enTRz179tQnn3yiJ554QsXFxXr33XclRf6xfu211zRw4ECNGTMmaHs4H2upFcZIa1dVVaXvf//7MsZo+fLlQbctXLgw8N/Jyclq3769fvrTnyo7OzssP374Bz/4QeC/hwwZouTkZN1yyy3asWOHJkyYYHFmzWP16tWaMWOGoqKigraH83HOzMzU4cOHtWvXLttTaTb1rdnn8yktLU2DBg3Sr371q6DbnnrqqcB/Dx8+XJWVlVq6dGlYvEDVtu7/Da4hQ4YoISFBEyZM0GeffaZbbrmluad5XdV3rC9cuKCcnJyg43pVOB9rKUJPYK1LfHy8JF1zpn15eXngtvj4eJ05cybo9suXL+urr74KjAlHV0Pk5MmTysvLq/crqEeNGqXLly/rxIkTzTPBG+zmm29W9+7ddezYMUmRe5wl6a9//auKi4s1e/bseseGy3GeN2+eNm3apI8//liJiYmB7fHx8bp06ZLOnj0bNP7bz+manvNXb2upalvzVRUVFZoyZYqio6O1YcMGtWvXrs77GzVqlE6dOiW/33+jpnxd1Lfu/zVq1ChJCnpeR+KxlqT169fr/PnzysjIqPf+wuVYX9XqYiQpKUnx8fHatm1bYJvP59PevXuVkpIiSUpJSdHZs2e1f//+wJjt27eruro68IMfbq6GyNGjR/XRRx+pW7du9e5TVFSkNm3aXPOrjHB16tQpffnll0pISJAUmcf5qtdee00jR47U0KFD6x3b0o+zMUbz5s3Thg0btH37diUlJQXdPnLkSLVr1y7oOV1cXKySkpKg5/ShQ4eC4vNqkA8aNKh5FhKC+tYsffPv1qRJk9S+fXu9995717wDVpOioiJ17dq1xb4D1pB1f1tRUZEkBT2vI+1YX/Xaa6/pnnvuUY8ePeq935Z+rK9h8eTZG6aiosIcPHjQHDx40Egyzz//vDl48GDgL0eWLFliunTpYjZu3Gg++eQTM23aNJOUlGQuXLgQuI8pU6aY4cOHm71795pdu3aZfv36menTp9taUr3qWvOlS5fMPffcYxITE01RUZEpLS0NXK6eXb57927zwgsvmKKiIvPZZ5+ZN9980/To0cNkZGRYXlnt6lpzRUWF+dnPfmYKCgrM8ePHzUcffWRGjBhh+vXrZy5evBi4j0g6zld5vV7TsWNHs3z58mv2D8fj/OCDDxq322127NgR9LN7/vz5wJi5c+ea3r17m+3bt5vCwkKTkpJiUlJSArdfvnzZDB482EyaNMkUFRWZDz74wPTo0cNkZWXZWFK96luz1+s1o0aNMkOGDDHHjh0LGnP58mVjjDHvvfee+f3vf28OHTpkjh49al555RXTsWNHs2jRIptLq1N96z527JhZvHixKSwsNMePHzcbN240N998sxk7dmzgPiLtWF919OhR43A4zJYtW665j3A81t8WkTHy8ccfG0nXXGbOnGmM+ebPe5966ikTFxdnnE6nmTBhgikuLg66jy+//NJMnz7ddO7c2bhcLvOjH/3IVFRUWFhNw9S15uPHj9d4myTz8ccfG2OM2b9/vxk1apRxu90mKirKDBw40Pzf//1f0At3S1PXms+fP28mTZpkevToYdq1a2f69Olj5syZE/TnfsZE1nG+auXKlaZDhw7m7Nmz1+wfjse5tp/d119/PTDmwoUL5qGHHjJdu3Y1HTt2NN/73vdMaWlp0P2cOHHCpKammg4dOpju3bubxx57LOjPYFuS+tZc28+BJHP8+HFjzDd/pj5s2DDTuXNn06lTJzN06FCzYsUKc+XKFXsLq0d96y4pKTFjx441MTExxul0mr59+5rHH3/ceL3eoPuJpGN9VVZWlvF4PDUev3A81t/mMCaM/vYHAABEnFZ3zggAAGhZiBEAAGAVMQIAAKwiRgAAgFXECAAAsIoYAQAAVhEjAADAKmIEAABYRYwAAACriBEAAGAVMQIAAKwiRgAAgFX/D3lV10L6PaKqAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hlines(1, cx_start, cx_end)\n", + "plt.hlines(2, c_start, c_end)\n", + "plt.hlines(3, qx_start, qx_end)\n", + "plt.hlines(4, q_start, q_end)" + ] } ], "metadata": {