diff --git a/experiments/configs/hp_search/Stocks.gin b/experiments/configs/hp_search/Stocks.gin
index c33d3ad..43c8610 100644
--- a/experiments/configs/hp_search/Stocks.gin
+++ b/experiments/configs/hp_search/Stocks.gin
@@ -7,7 +7,7 @@ build.variables_dict = {
# 'ForecastDataset.features': ['m', 'h', 'd'],
'deeptime3.base_learner': ['Ridge', 'None', 'Transformer'],
'deeptime3.inr': ['INR', 'INRPlus2'],
- 'deeptime3.encoder': ['inception', ],
+ 'deeptime3.encoder': ['inception', 'lstm', 'mlp', 'lstm2', 'transformer', 'transformer2', 'none'],
# 'deeptime3.dropout': [0.0, 0.1, 0.3, 0.5,],
}
@@ -28,11 +28,11 @@ train.clip = 10.
Checkpoint.patience = 7
-deeptime3.layer_size = 32
+deeptime3.layer_size = 256
deeptime3.inr_layers = 5
-deeptime3.dropout = 0.3
+deeptime3.dropout = 0.1
deeptime3.base_learner = 'Ridge'
-deeptime3.n_fourier_feats = 2048
+deeptime3.n_fourier_feats = 4096
deeptime3.scales = [0.01, 0.1, 1, 5, 10, 20, 50, 100]
ForecastDataset.data_path = 'stocks/OXY_2019.csv.gz'
@@ -44,4 +44,4 @@ ForecastDataset.time_features = []
ForecastDataset.normalise_time_features = True
ForecastDataset.features = 'M2S'
ForecastDataset.horizon_len = 46
-ForecastDataset.lookback_mult = 2
+ForecastDataset.lookback_mult = 3
diff --git a/experiments/forecast.py b/experiments/forecast.py
index a9ef38b..9b9afe2 100644
--- a/experiments/forecast.py
+++ b/experiments/forecast.py
@@ -2,6 +2,7 @@ import os
from os.path import join
import math
import logging
+import json
from typing import Callable, Optional, Union, Dict, Tuple
import gin
@@ -31,8 +32,11 @@ class ForecastExperiment(Experiment):
val_set, val_loader = get_data(flag='val')
test_set, test_loader = get_data(flag='test')
+ dim_size=train_set.data_x.shape[1]
+ seq_len = train_set[0][1].shape
model = get_model(model_type,
- dim_size=train_set.data_x.shape[1],
+ dim_size=dim_size,
+ seq_len=seq_len,
datetime_feats=train_set.timestamps.shape[-1]).to(default_device())
checkpoint = Checkpoint(self.root)
@@ -43,7 +47,8 @@ class ForecastExperiment(Experiment):
val_metrics = validate(model, loader=val_loader, report_metrics=True)
test_metrics = validate(model, loader=test_loader, report_metrics=True,
save_path=self.root if save_vals else None)
- np.save(join(self.root, 'metrics.npy'), {'val': val_metrics, 'test': test_metrics})
+ # np.save(join(self.root, 'metrics.npy'), {'val': val_metrics, 'test': test_metrics})
+ json.dump({'val': val_metrics, 'test': test_metrics}, open(join(self.root, 'metrics.npy', 'w')))
val_metrics = {f'ValMetric/{k}': v for k, v in val_metrics.items()}
test_metrics = {f'TestMetric/{k}': v for k, v in test_metrics.items()}
diff --git a/mjc_notes.md b/mjc_notes.md
index 576ba50..9586ffa 100644
--- a/mjc_notes.md
+++ b/mjc_notes.md
@@ -72,6 +72,7 @@ TODO:
- [x] M2S mode
- [ ] add other INR's
- [ ] add None as learner
+- [ ] no encoder?
```
python -m experiments.forecast --config_path=experiments/configs/hp_search/Stocks.gin build_experiment
diff --git a/models/DeepTIMe3.py b/models/DeepTIMe3.py
index 5c087a4..abaad51 100644
--- a/models/DeepTIMe3.py
+++ b/models/DeepTIMe3.py
@@ -20,28 +20,36 @@ from models.modules.encoders import LSTMEncoder, TransformerEncoder2, Transforme
# 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, 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)
+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, seq_len: int):
+ return DeepTIMe3(dim_size, datetime_feats, layer_size, inr_layers, n_fourier_feats, scales, dropout, base_learner, encoder, inr, seq_len)
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, base_learner:str='Ridge', encoder:str='inception', inr:str='INR'):
+ 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', seq_len: int=46):
super().__init__()
# encode the past
+ encoded_size = layer_size
+ encoder_features = 24
+ encoder_layers = 3
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,
+ self.encoder = InceptionEncoder(
+ c_in=dim_size, c_out=encoded_size, dilation=6,
+ layer_size=17, layers=encoder_layers, dropout=dropout,
)
elif encoder == 'lstm':
- self.encoder = LSTMEncoder()
+ self.encoder = LSTMEncoder(c_in=dim_size, c_out=encoded_size, dropout=dropout, layers=encoder_layers, layer_size=24)
+ elif encoder == 'lstm2':
+ self.encoder = LSTMEncoder2(c_in=dim_size, c_out=encoded_size, dropout=dropout, layers=encoder_layers, layer_size=32, seq_len=seq_len)
+ elif encoder == 'mlp':
+ self.encoder = MLPEncoder(c_in=dim_size, c_out=encoded_size, dropout=dropout, layers=encoder_layers, layer_size=256)
+ elif encoder == 'transformer':
+ self.encoder = TransformerEncoder(c_in=dim_size, c_out=encoded_size, dropout=dropout, layers=encoder_layers, layer_size=256, seq_len=seq_len)
+ elif encoder == 'transformer2':
+ self.encoder = TransformerEncoder2(c_in=dim_size, c_out=encoded_size, dropout=dropout, layers=encoder_layers, layer_size=256, seq_len=seq_len)
+ elif encoder == 'none':
+ self.encoder = None
+ encoded_size = 0
else:
raise NotADirectoryError(encoder)
@@ -49,10 +57,10 @@ class DeepTIMe3(nn.Module):
coord_size = 1
in_feats=datetime_feats+encoded_size+coord_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)
+ self.inr = INRPlus2(in_feats=in_feats, out_feats=layer_size, layers=inr_layers, layer_size=max(17, layer_size//8),
+ n_fourier_feats=n_fourier_feats//4, scales=scales, dropout=dropout)
elif inr=="INR":
- self.inr = INR(in_feats=in_feats, layers=inr_layers, layer_size=layer_size,
+ self.inr = INR(in_feats=in_feats, out_feats=layer_size, layers=inr_layers, layer_size=layer_size,
n_fourier_feats=n_fourier_feats, scales=scales, dropout=dropout)
else:
raise NotImplementedError(inr)
@@ -75,15 +83,20 @@ class DeepTIMe3(nn.Module):
# we summarize the past into a single hidden layer. Then repeat it for each coordinate
past_len = time.shape[1]
- encoded_x = self.encoder(past_x.transpose(2, 1))
- encoded_x = repeat(encoded_x, "b f -> b t f", t=past_len)
+ if self.encoder is not None:
+ encoded_x = self.encoder(past_x)
+ encoded_x = repeat(encoded_x, "b f -> b t f", t=past_len)
+
# relative coordinates are the same for each batch, so we make them once and repeat them
coords = self.get_coords(past_len).to(time.device) + offset
coords = repeat(coords, "1 t 1 -> b t 1", b=time.shape[0])
# combine and run INR to decode the representation
- context_input = torch.cat([encoded_x, coords, time], dim=-1)
+ if self.encoder is not None:
+ context_input = torch.cat([encoded_x, coords, time], dim=-1)
+ else:
+ context_input = torch.cat([coords, time], dim=-1)
context_repr = self.inr(context_input)
return context_repr
diff --git a/models/__init__.py b/models/__init__.py
index 4f0b44f..6aef6d8 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -13,7 +13,7 @@ def get_model(model_type: str, **kwargs: Union[int, float]) -> torch.nn.Module:
elif model_type=="deeptime2":
model = deeptime2(datetime_feats=kwargs['datetime_feats'], dim_size=kwargs['dim_size'])
elif model_type=="deeptime3":
- model = deeptime3(datetime_feats=kwargs['datetime_feats'], dim_size=kwargs['dim_size'])
+ model = deeptime3(datetime_feats=kwargs['datetime_feats'], dim_size=kwargs['dim_size'], seq_len=kwargs['seq_len'])
else:
raise ValueError(f"Unknown model type {model_type}")
return model
diff --git a/models/modules/encoders.py b/models/modules/encoders.py
index 8d73f62..59e8416 100644
--- a/models/modules/encoders.py
+++ b/models/modules/encoders.py
@@ -44,10 +44,10 @@ class LinBnDropSN(nn.Sequential):
class InceptionEncoder(nn.Module):
- def __init__(self, c_in, c_out, *args, **kwargs):
+ def __init__(self, c_in, c_out, dropout, layers, layer_size, *args, **kwargs):
super().__init__()
self.net = CausalInceptionTimePlus(
- c_in=c_in, c_out=c_out, custom_head=custom_head, *args, **kwargs
+ c_in=c_in, c_out=c_out, ks=[39, 19, 3], custom_head=custom_head, coord=True, fc_dropout=dropout, bn=True, depth=layers, nf=layer_size, *args, **kwargs
)
bn = kwargs.get("bn", True)
fc_dropout = kwargs.get("fc_dropout", 0.15)
@@ -59,7 +59,7 @@ class InceptionEncoder(nn.Module):
)
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),
+ LinBnDropSN(c_out*2, c_out, bn=bn, p=fc_dropout),
)
def forward(self, x):
@@ -258,15 +258,17 @@ class MLPEncoder(nn.Module):
super().__init__()
self.net = INR(
in_feats=c_in,
+ out_feats=layer_size,
scales=scales,
n_fourier_feats=n_fourier_feats,
layers=layers,
layer_size=layer_size,
)
+ self.head = nn.Linear(layer_size, c_out)
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]
+ return self.head(self.net(x)[:, -1])
diff --git a/models/modules/inr.py b/models/modules/inr.py
index d0b65c5..1ca32f4 100644
--- a/models/modules/inr.py
+++ b/models/modules/inr.py
@@ -31,7 +31,7 @@ class INRLayer(nn.Module):
class INR(nn.Module):
- def __init__(self, in_feats: int, layers: int, layer_size: int, n_fourier_feats: int, scales: float,
+ def __init__(self, in_feats: int, out_feats:int, layers: int, layer_size: int, n_fourier_feats: int, scales: float,
dropout: Optional[float] = 0.1):
super().__init__()
self.features = nn.Linear(in_feats, layer_size) if n_fourier_feats == 0 \
@@ -39,7 +39,7 @@ class INR(nn.Module):
in_size = layer_size if n_fourier_feats == 0 \
else n_fourier_feats
layers = [INRLayer(in_size, layer_size, dropout=dropout)] + \
- [INRLayer(layer_size, layer_size, dropout=dropout) for _ in range(layers - 1)]
+ [INRLayer(layer_size, out_feats, dropout=dropout) for _ in range(layers - 1)]
self.layers = nn.Sequential(*layers)
def forward(self, x: Tensor) -> Tensor:
diff --git a/models/modules/inrplus2.py b/models/modules/inrplus2.py
index 9a69c5c..8a2861f 100644
--- a/models/modules/inrplus2.py
+++ b/models/modules/inrplus2.py
@@ -12,16 +12,16 @@ from torch import Tensor
from models.modules.feature_transforms import GaussianFourierFeatureTransform
from tsai.models.InceptionTimePlus import InceptionTimePlus
-from .causalinception import CausalInceptionTimePlus, CausalConv1d
+from .causalinception import CausalInceptionTimePlus, CausalConv1d, Conv
def custom_head(head_nf, c_out, seq_len):
return nn.Sequential(
- CausalConv1d(head_nf, c_out, 1, bias=False)
-
+ # CausalConv1d(head_nf, c_out, 1, bias=False, norm="Spectral")
+ Conv(head_nf, c_out, 1, bias=False, norm="Spectral"),
)
class INRPlus2(nn.Module):
- def __init__(self, in_feats: int, layers: int, layer_size: int, n_fourier_feats: int, scales: float,
+ def __init__(self, in_feats: int, out_feats:int ,layers: int, layer_size: int, n_fourier_feats: int, scales: float,
dropout: Optional[float] = 0.5, bn=False, *args, **kwargs):
super().__init__()
self.n_fourier_feats = n_fourier_feats
@@ -31,8 +31,8 @@ class INRPlus2(nn.Module):
in_size = in_feats if n_fourier_feats == 0 \
else n_fourier_feats+in_feats
self.layers = CausalInceptionTimePlus(
- in_size, layer_size, seq_len=None, nf=layer_size, depth=layers,
- flatten=False, concat_pool=False, fc_dropout=dropout, conv_dropout=0.05, bn=bn, y_range=None, custom_head=custom_head, ks=[139, 19, 3], dilation=2, *args, **kwargs
+ in_size, out_feats, seq_len=None, nf=layer_size, depth=layers,
+ flatten=False, concat_pool=False, fc_dropout=dropout, conv_dropout=dropout/4, bn=bn, y_range=None, custom_head=custom_head, ks=[139, 19, 3], dilation=2, *args, **kwargs
)
# layers = [INRPlusLayer(in_size, layer_size, dropout=dropout)] + \
# [INRPlusLayer(layer_size, layer_size, dropout=dropout) for _ in range(layers - 1)]
diff --git a/models/modules/metareghead.py b/models/modules/metareghead.py
index 234d1b5..46a5882 100644
--- a/models/modules/metareghead.py
+++ b/models/modules/metareghead.py
@@ -7,9 +7,16 @@ from models.modules.regressors import RidgeRegressor
from models.modules.inr import INR, INRLayer
class SumHead(nn.Module):
- def __init__(self, d, c_out=1, ):
+ def __init__(self, d, c_out=1, dropout=0):
super().__init__()
- self.l = nn.Linear(d, c_out) # init a random transform
+ # self.conv = nn.Sequential(
+ # CausalConv1d(head_nf, c_out, 1, bias=False, norm="Spectral"),
+ # )
+ self.l = nn.Sequential(
+ INRLayer(d, d, dropout=dropout),
+ # INRLayer(d, d, dropout=dropout),
+ nn.Linear(d, c_out)
+ ) # nn.Linear(d, c_out) # init a random transform
def forward(self, query, support, support_labels):
return self.l(query)
@@ -27,7 +34,7 @@ class TransformerHead(nn.Module):
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)
+ 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, dropout=0)
# after using attention let's decode it
self.decoder = nn.Sequential(
INRLayer(d, d, dropout=dropout),
@@ -40,12 +47,12 @@ class TransformerHead(nn.Module):
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.
+ 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)
@@ -62,7 +69,7 @@ class RegressionHead(nn.Module):
# the regular DeepTime one
self.head = RidgeRegressor()
elif ("None" in base_learner):
- self.head = SumHead(d=d)
+ self.head = SumHead(d=d, dropout=dropout)
elif ("Transformer" in base_learner):
self.head = TransformerHead(d=d, dropout=dropout, num_heads=num_heads)
else:
diff --git a/scratch-run_exp.ipynb b/scratch-run_exp.ipynb
index ec29b6c..a81baa6 100644
--- a/scratch-run_exp.ipynb
+++ b/scratch-run_exp.ipynb
@@ -21,8 +21,8 @@
"id": "7f9e3d73",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:17:16.252902Z",
- "start_time": "2022-11-22T13:17:16.244846Z"
+ "end_time": "2022-11-23T03:32:18.927915Z",
+ "start_time": "2022-11-23T03:32:18.918871Z"
}
},
"outputs": [],
@@ -41,8 +41,8 @@
"id": "4e09086b",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:17:17.421370Z",
- "start_time": "2022-11-22T13:17:16.254109Z"
+ "end_time": "2022-11-23T03:32:20.144762Z",
+ "start_time": "2022-11-23T03:32:18.928928Z"
},
"lines_to_next_cell": 0
},
@@ -80,16 +80,34 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"id": "66d7f095",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-19T23:55:34.939075Z",
- "start_time": "2022-11-19T23:55:34.820277Z"
+ "end_time": "2022-11-23T03:32:20.171177Z",
+ "start_time": "2022-11-23T03:32:20.146544Z"
}
},
- "outputs": [],
- "source": []
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import logging\n",
+ "logging.root.setLevel(logging.INFO)\n",
+ "\n",
+ "from loguru import logger\n",
+ "logger.remove()\n",
+ "logger.add(os.sys.stdout, level=\"INFO\", colorize=True, format=\"{time} | {message}\")"
+ ]
},
{
"cell_type": "markdown",
@@ -101,26 +119,15 @@
},
{
"cell_type": "code",
- "execution_count": 19,
+ "execution_count": 4,
"id": "04499bef",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:20:49.179263Z",
- "start_time": "2022-11-22T13:20:49.094704Z"
+ "end_time": "2022-11-23T03:32:20.191130Z",
+ "start_time": "2022-11-23T03:32:20.172479Z"
}
},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 19,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"\n",
"\n",
@@ -172,7 +179,7 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "06a196e5",
+ "id": "09dd5ebd",
"metadata": {
"ExecuteTime": {
"end_time": "2022-11-22T13:28:35.849491Z",
@@ -185,12 +192,59 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "id": "442614f6",
+ "execution_count": 5,
+ "id": "dc530891",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:29:32.186666Z",
- "start_time": "2022-11-22T13:29:32.108212Z"
+ "end_time": "2022-11-23T03:32:20.213967Z",
+ "start_time": "2022-11-23T03:32:20.192307Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w']"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "list(mcolors.BASE_COLORS.keys())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "da8f502f",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-22T13:38:15.786656Z",
+ "start_time": "2022-11-22T13:38:15.303577Z"
+ }
+ },
+ "source": [
+ "# view model"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ccc9fdb0",
+ "metadata": {},
+ "source": [
+ "# run exps"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e09f2823",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-23T03:31:08.583641Z",
+ "start_time": "2022-11-23T03:31:08.558690Z"
}
},
"outputs": [],
@@ -198,19 +252,208 @@
},
{
"cell_type": "code",
- "execution_count": 135,
- "id": "768530be",
+ "execution_count": 6,
+ "id": "9d13d779",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:40:23.550516Z",
- "start_time": "2022-11-22T13:40:23.526514Z"
+ "end_time": "2022-11-23T03:32:20.232318Z",
+ "start_time": "2022-11-23T03:32:20.215075Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INR,encoder=mlp,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INRPlus2,encoder=inception,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INRPlus2,encoder=none,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INRPlus2,encoder=transformer2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INR,encoder=transformer,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INR,encoder=lstm,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INR,encoder=mlp,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INR,encoder=transformer,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INR,encoder=transformer2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INR,encoder=lstm,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INR,encoder=lstm2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INRPlus2,encoder=mlp,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INRPlus2,encoder=transformer,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INRPlus2,encoder=inception,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INR,encoder=mlp,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INRPlus2,encoder=transformer2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INR,encoder=lstm,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INR,encoder=transformer2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INRPlus2,encoder=mlp,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INR,encoder=lstm2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INR,encoder=transformer,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INRPlus2,encoder=lstm2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INRPlus2,encoder=lstm,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INRPlus2,encoder=transformer2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INR,encoder=lstm2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INR,encoder=transformer2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INRPlus2,encoder=inception,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INRPlus2,encoder=none,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INR,encoder=inception,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INRPlus2,encoder=mlp,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INRPlus2,encoder=transformer,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INRPlus2,encoder=lstm,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INR,encoder=inception,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INR,encoder=none,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INR,encoder=none,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INR,encoder=inception,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INRPlus2,encoder=lstm2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INRPlus2,encoder=lstm2,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INR,encoder=none,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INRPlus2,encoder=transformer,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INRPlus2,encoder=none,repeat=0/config.gin'), Path('storage/experiments/Stocks/96M2S/base_learner=Ridge,inr=INRPlus2,encoder=lstm,repeat=0/config.gin')]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# list the models we have run...\n",
+ "configs=sorted(Path(\"storage/experiments/Stocks\").glob(\"**/config.gin\"))\n",
+ "import random\n",
+ "random.shuffle(configs)\n",
+ "print(configs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "4178d85e",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-23T03:32:20.248919Z",
+ "start_time": "2022-11-23T03:32:20.233964Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from experiments.forecast import ForecastExperiment"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8eadaa48",
+ "metadata": {
+ "ExecuteTime": {
+ "start_time": "2022-11-23T04:00:02.202Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "storage/experiments/Stocks/96M2S/base_learner=Transformer,inr=INR,encoder=mlp,repeat=0/config.gin\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "INFO:root:epochs: 1, iters: 100 | training loss: 2.41\n",
+ "INFO:root:Validation loss decreased (inf --> 1.004). Saving model ...\n",
+ "INFO:root:epochs: 2, iters: 100 | training loss: 0.20\n",
+ "INFO:root:Validation loss decreased (1.004 --> 0.115). Saving model ...\n"
+ ]
+ }
+ ],
+ "source": [
+ "for config in configs:\n",
+ " save_path = config.parent\n",
+ "\n",
+ " exp = ForecastExperiment(config_path=config)\n",
+ " print(config)\n",
+ " try:\n",
+ " exp.run()\n",
+ " except KeyboardInterrupt:\n",
+ " raise\n",
+ " except Exception as e:\n",
+ "# raise\n",
+ " print(e)\n",
+ " pass"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e7a3c151",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-23T03:36:04.312188Z",
+ "start_time": "2022-11-23T03:36:04.312180Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "exp.instance()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8b73c64e",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-23T03:36:04.313334Z",
+ "start_time": "2022-11-23T03:36:04.313322Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# save_path = Path('storage/experiments/Stocks/96M2S/repeat=0')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6af1bb1e",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-23T03:36:04.313962Z",
+ "start_time": "2022-11-23T03:36:04.313954Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# gin.clear_config()\n",
+ "# config_path = save_path/\"config.gin\"\n",
+ "# gin.parse_config(open(config_path))\n",
+ "# model_name = gin.query_parameter(\"instance.model_type\")\n",
+ "# model_name"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "50a92a7e",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-23T03:36:04.314594Z",
+ "start_time": "2022-11-23T03:36:04.314588Z"
}
},
"outputs": [],
"source": [
"\n",
+ "# exp = ForecastExperiment(config_path=config_path)\n",
+ "# # exp.run()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9ef76b76",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-23T03:36:04.315217Z",
+ "start_time": "2022-11-23T03:36:04.315210Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def save_path2name(save_path: Path) -> str:\n",
+ " \"\"\"\n",
+ " Path('storage/experiments/Stocks/96M2S/base_learner=None,inr=INR,encoder=mlp,repeat=0')\n",
+ " to \n",
+ " '96M2S-None_INR_mlp_0'\n",
+ " \"\"\"\n",
+ " mtitle = str(save_path).split('/')[-2:]\n",
+ " tags = mtitle[-1]\n",
+ " tags = [x.split('=')[-1] for x in tags.split(',')]\n",
+ " mtitle[-1] = '_'.join(tags)\n",
+ " mtitle = \"-\".join(mtitle)\n",
+ " return mtitle\n",
"\n",
- "def plot_multi(save_paths=[Path(\"storage/experiments/Exchange/96M/repeat=0\")], i=200, title=None, plot=True):\n",
+ "# save_path2name(save_path)\n",
+ "# save_path"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3637e87d",
+ "metadata": {},
+ "source": [
+ "# view all"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "768530be",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-23T03:36:04.315891Z",
+ "start_time": "2022-11-23T03:36:04.315884Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from torchsummaryX import summary\n",
+ "\n",
+ "def plot_multi(save_paths=[Path(\"storage/experiments/Exchange/96M/repeat=0\")], i=200, title=None, plot=True, verbose=1,):\n",
" assert len(save_paths)>0\n",
" for j in range(len(save_paths)):\n",
" save_path = save_paths[j]\n",
@@ -220,12 +463,15 @@
" model_name = gin.query_parameter(\"instance.model_type\")\n",
"\n",
" train_set, train_loader = get_data(flag='test', batch_size=3)\n",
- "\n",
+ " seq_len = train_set[0][1].shape\n",
" model = get_model(model_name,\n",
" dim_size=train_set.data_x.shape[1],\n",
+ " seq_len=seq_len,\n",
" datetime_feats=train_set.timestamps.shape[-1]).to(default_device())\n",
" model.load_state_dict(torch.load(save_path/'model.pth'))\n",
" model = model.eval()\n",
+ " \n",
+ " \n",
"\n",
"\n",
" b = train_set[i]\n",
@@ -233,7 +479,13 @@
" b2 = list(map(to_tensor, b))\n",
" \n",
"# b = next(iter(train_loader))\n",
- "# print([s.shape for s in b])\n",
+ "# print([s.shape for s in b]\n",
+ " \n",
+ " if verbose>1:\n",
+ " \n",
+ "# print(model)\n",
+ " summary(model, *b2)\n",
+ " print(save_path)\n",
" \n",
" context_past_x, context_y, query_past_x, query_y, context_time, query_time = b2\n",
" with torch.no_grad():\n",
@@ -247,21 +499,18 @@
" l2 = query_time.shape[1]\n",
" i_past = list(range(l))\n",
" i_future = list(range(l, l+l2))\n",
+ " \n",
+ " \n",
"\n",
" if plot:\n",
- " \n",
- " mtitle = str(save_path).split('/')[-2:]\n",
" \n",
- " tags = mtitle[-1]\n",
- " tags = [x.split('=')[-1] for x in tags.split(',')]\n",
+ " if j==0:\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",
+ " mtitle = save_path2name(save_path)\n",
+ " plt.plot(i_future, forecast2[:, 0], linestyle='--', label=f\"{mtitle}\") # c=colors[j], \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",
+ "\n",
" plt.legend()\n",
" plt.title(title)\n",
" return x2, y2, forecast2, i_past, i_future\n"
@@ -270,250 +519,100 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "85eb0a18",
- "metadata": {
- "ExecuteTime": {
- "end_time": "2022-11-22T13:38:15.786656Z",
- "start_time": "2022-11-22T13:38:15.303577Z"
- }
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "id": "2c7f4971",
- "metadata": {},
- "source": [
- "# run exp"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 91,
- "id": "6e876b82",
- "metadata": {
- "ExecuteTime": {
- "end_time": "2022-11-22T13:32:31.609545Z",
- "start_time": "2022-11-22T13:32:31.593738Z"
- }
- },
- "outputs": [],
- "source": [
- "save_path = Path('storage/experiments/Stocks/96M2S/repeat=0')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 92,
- "id": "4c40cef9",
- "metadata": {
- "ExecuteTime": {
- "end_time": "2022-11-22T13:32:31.880691Z",
- "start_time": "2022-11-22T13:32:31.848245Z"
- }
- },
- "outputs": [
- {
- "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": [
- "gin.clear_config()\n",
- "config_path = save_path/\"config.gin\"\n",
- "gin.parse_config(open(config_path))\n",
- "model_name = gin.query_parameter(\"instance.model_type\")\n",
- "model_name"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 93,
- "id": "fb3e6e3f",
- "metadata": {
- "ExecuteTime": {
- "end_time": "2022-11-22T13:32:32.188870Z",
- "start_time": "2022-11-22T13:32:32.152703Z"
- }
- },
- "outputs": [
- {
- "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": [
- "from experiments.forecast import ForecastExperiment\n",
- "exp = ForecastExperiment(config_path=config_path)\n",
- "exp"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 94,
- "id": "2b97837c",
- "metadata": {
- "ExecuteTime": {
- "end_time": "2022-11-22T13:32:32.294346Z",
- "start_time": "2022-11-22T13:32:32.275437Z"
- }
- },
- "outputs": [],
- "source": [
- "# exp.run()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "564a891e",
- "metadata": {},
- "source": [
- "# view all"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 151,
"id": "739ee5e3",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:48:14.546039Z",
- "start_time": "2022-11-22T13:48:13.703677Z"
+ "end_time": "2022-11-23T03:36:04.316469Z",
+ "start_time": "2022-11-23T03:36:04.316463Z"
}
},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[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"
- ]
- }
- ],
+ "outputs": [],
"source": [
"# list the models we have run...\n",
- "m=sorted(Path(\"storage/experiments/Stocks\").glob(\"**/_SUCCESS\"))\n",
+ "m=sorted(Path(\"storage/experiments/Stocks/96M2S\").glob(\"**/_SUCCESS\"))\n",
"print(m)"
]
},
{
"cell_type": "code",
- "execution_count": 152,
- "id": "95be3adb",
+ "execution_count": null,
+ "id": "48e9175b",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:48:15.238855Z",
- "start_time": "2022-11-22T13:48:15.223681Z"
+ "end_time": "2022-11-23T03:36:04.316979Z",
+ "start_time": "2022-11-23T03:36:04.316973Z"
}
},
"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",
- "# ]"
+ "for mm in m:\n",
+ " mtitle = save_path2name(mm.parent)\n",
+ " print(mtitle)\n",
+ " m3 = np.load(mm.parent/'metrics.npy', allow_pickle=1)\n",
+ " m3 = eval(str(m3))\n",
+ " print(m3['val']['mape'])"
]
},
{
"cell_type": "code",
- "execution_count": 153,
- "id": "5a558fc3",
+ "execution_count": null,
+ "id": "4b966ef7",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:48:16.061250Z",
- "start_time": "2022-11-22T13:48:15.395935Z"
+ "end_time": "2022-11-23T03:36:04.317585Z",
+ "start_time": "2022-11-23T03:36:04.317578Z"
}
},
- "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",
- "receptive field [114 126 42]=[38 18 2]*[[ 1 1 1]\n",
- " [ 1 2 4]\n",
- " [ 1 4 16]]\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "1"
- ]
- },
- "execution_count": 153,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
+ "outputs": [],
+ "source": [
+ "train_set, train_loader = get_data(flag='train')\n",
+ "train_set[0][1].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0b696e85",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-23T03:36:04.318277Z",
+ "start_time": "2022-11-23T03:36:04.318270Z"
}
- ],
+ },
+ "outputs": [],
+ "source": [
+ "save_paths = [mm.parent for mm in m]\n",
+ "for mm in m:\n",
+ " try:\n",
+ " plot_multi(\n",
+ " save_paths=[mm.parent],\n",
+ " i=600,\n",
+ " verbose=2,\n",
+ " )\n",
+ " except:\n",
+ " print('failed', mm)\n",
+ "# mm.unlink()\n",
+ " pass\n",
+ "1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ac9e5759",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-11-23T03:36:04.319520Z",
+ "start_time": "2022-11-23T03:36:04.319512Z"
+ }
+ },
+ "outputs": [],
"source": [
"save_paths = [mm.parent for mm in m]\n",
"plot_multi(\n",
" save_paths=save_paths,\n",
- " i=1000,\n",
+ " i=200,\n",
+ " verbose=0,\n",
")\n",
"1"
]
@@ -521,20 +620,22 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "5c5dc852",
+ "id": "b2e27d42",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T12:08:05.811964Z",
- "start_time": "2022-11-22T12:07:40.797468Z"
+ "end_time": "2022-11-23T03:36:04.320031Z",
+ "start_time": "2022-11-23T03:36:04.320024Z"
}
},
"outputs": [],
- "source": []
+ "source": [
+ "256/24"
+ ]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "71995595",
+ "id": "938f06db",
"metadata": {
"ExecuteTime": {
"end_time": "2022-11-22T13:17:31.585029Z",
@@ -546,7 +647,7 @@
},
{
"cell_type": "markdown",
- "id": "52fac522",
+ "id": "9b4e817c",
"metadata": {},
"source": [
"# check positions in dl"
@@ -554,24 +655,16 @@
},
{
"cell_type": "code",
- "execution_count": 139,
- "id": "00715926",
+ "execution_count": null,
+ "id": "df6c9b28",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:41:08.258955Z",
- "start_time": "2022-11-22T13:41:08.185519Z"
+ "end_time": "2022-11-23T03:36:04.320752Z",
+ "start_time": "2022-11-23T03:36:04.320745Z"
},
"scrolled": true
},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[(92, 5), (46, 1), (92, 5), (46, 1), (46, 7), (46, 7)]\n"
- ]
- }
- ],
+ "outputs": [],
"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",
@@ -581,26 +674,15 @@
},
{
"cell_type": "code",
- "execution_count": 80,
- "id": "6c7e008f",
+ "execution_count": null,
+ "id": "fa54042e",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:31:53.654372Z",
- "start_time": "2022-11-22T13:31:53.638605Z"
+ "end_time": "2022-11-23T03:36:04.321671Z",
+ "start_time": "2022-11-23T03:36:04.321662Z"
}
},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(100, 192, 192, 238, 146, 238, 238, 284)"
- ]
- },
- "execution_count": 80,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"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"
@@ -608,42 +690,46 @@
},
{
"cell_type": "code",
- "execution_count": 81,
- "id": "6d2f9c5f",
+ "execution_count": null,
+ "id": "2482f0f7",
"metadata": {
"ExecuteTime": {
- "end_time": "2022-11-22T13:31:53.744404Z",
- "start_time": "2022-11-22T13:31:53.655231Z"
+ "end_time": "2022-11-23T03:36:04.322543Z",
+ "start_time": "2022-11-23T03:36:04.322535Z"
}
},
- "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"
- }
- ],
+ "outputs": [],
"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)"
+ "plt.hlines(1, cx_start, cx_end, color='green', alpha=0.5, label='context_past_x')\n",
+ "plt.hlines(2, c_start, c_end, color='green', label='context_labels')\n",
+ "plt.hlines(3, qx_start, qx_end, alpha=0.5, label='query_past_x')\n",
+ "plt.hlines(4, q_start, q_end, label='query_labels/target')\n",
+ "plt.legend(loc='upper left')"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e8fe355e",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3a978978",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "045d3fd5",
+ "metadata": {},
+ "outputs": [],
+ "source": []
}
],
"metadata": {