mirror of
https://github.com/wassname/pytorch-ts.git
synced 2026-07-18 12:40:51 +08:00
43 KiB
43 KiB
In [1]:
# import warnings
# warnings.simplefilter("ignore")
# autoreload import your package
%load_ext autoreload
%autoreload 2In [2]:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import torchIn [3]:
from gluonts.dataset.multivariate_grouper import MultivariateGrouper
from gluonts.dataset.repository.datasets import dataset_recipes, get_dataset
from gluonts.evaluation.backtest import make_evaluation_predictions
from gluonts.evaluation import MultivariateEvaluatorIn [4]:
from pts.model.tempflow import TempFlowEstimator
from pts.model.time_grad2 import TimeGradEstimator2
from pts.model.transformer_tempflow import TransformerTempFlowEstimator
from pts import TrainerIn [5]:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")In [6]:
def plot(target, forecast, prediction_length, prediction_intervals=(50.0, 90.0), color='g', fname=None):
label_prefix = ""
rows = 4
cols = 4
fig, axs = plt.subplots(rows, cols, figsize=(24, 24))
axx = axs.ravel()
seq_len, target_dim = target.shape
ps = [50.0] + [
50.0 + f * c / 2.0 for c in prediction_intervals for f in [-1.0, +1.0]
]
percentiles_sorted = sorted(set(ps))
def alpha_for_percentile(p):
return (p / 100.0) ** 0.3
for dim in range(0, min(rows * cols, target_dim)):
ax = axx[dim]
target[-2 * prediction_length :][dim].plot(ax=ax)
ps_data = [forecast.quantile(p / 100.0)[:,dim] for p in percentiles_sorted]
i_p50 = len(percentiles_sorted) // 2
p50_data = ps_data[i_p50]
p50_series = pd.Series(data=p50_data, index=forecast.index)
p50_series.plot(color=color, ls="-", label=f"{label_prefix}median", ax=ax)
for i in range(len(percentiles_sorted) // 2):
ptile = percentiles_sorted[i]
alpha = alpha_for_percentile(ptile)
ax.fill_between(
forecast.index,
ps_data[i],
ps_data[-i - 1],
facecolor=color,
alpha=alpha,
interpolate=True,
)
# Hack to create labels for the error intervals.
# Doesn't actually plot anything, because we only pass a single data point
pd.Series(data=p50_data[:1], index=forecast.index[:1]).plot(
color=color,
alpha=alpha,
linewidth=10,
label=f"{label_prefix}{100 - ptile * 2}%",
ax=ax,
)
legend = ["observations", "median prediction"] + [f"{k}% prediction interval" for k in prediction_intervals][::-1]
axx[0].legend(legend, loc="upper left")
if fname is not None:
plt.savefig(fname, bbox_inches='tight', pad_inches=0.05)In [7]:
print(f"Available datasets: {list(dataset_recipes.keys())}")Available datasets: ['constant', 'exchange_rate', 'solar-energy', 'electricity', 'traffic', 'exchange_rate_nips', 'electricity_nips', 'traffic_nips', 'solar_nips', 'wiki-rolling_nips', 'taxi_30min', 'kaggle_web_traffic_with_missing', 'kaggle_web_traffic_without_missing', 'kaggle_web_traffic_weekly', 'm1_yearly', 'm1_quarterly', 'm1_monthly', 'nn5_daily_with_missing', 'nn5_daily_without_missing', 'nn5_weekly', 'tourism_monthly', 'tourism_quarterly', 'tourism_yearly', 'cif_2016', 'london_smart_meters_without_missing', 'wind_farms_without_missing', 'car_parts_without_missing', 'dominick', 'fred_md', 'pedestrian_counts', 'hospital', 'covid_deaths', 'kdd_cup_2018_without_missing', 'weather', 'm3_monthly', 'm3_quarterly', 'm3_yearly', 'm3_other', 'm4_hourly', 'm4_daily', 'm4_weekly', 'm4_monthly', 'm4_quarterly', 'm4_yearly', 'm5', 'uber_tlc_daily', 'uber_tlc_hourly', 'airpassengers']
In [8]:
# exchange_rate_nips, electricity_nips, traffic_nips, solar_nips, wiki-rolling_nips, ## taxi_30min is buggy still
dataset = get_dataset("electricity_nips", regenerate=False)In [9]:
dataset.metadataOut [9]:
MetaData(freq='H', target=None, feat_static_cat=[CategoricalFeatureInfo(name='feat_static_cat_0', cardinality='370')], feat_static_real=[], feat_dynamic_real=[], feat_dynamic_cat=[], prediction_length=24)
In [10]:
train_grouper = MultivariateGrouper(max_target_dim=min(2000, int(dataset.metadata.feat_static_cat[0].cardinality)))
test_grouper = MultivariateGrouper(
num_test_dates=int(len(dataset.test)/len(dataset.train)*2),
# num_test_dates=7,
max_target_dim=min(2000, int(dataset.metadata.feat_static_cat[0].cardinality)))In [11]:
dataset_train = train_grouper(dataset.train)
dataset_test = test_grouper(dataset.test)/home/wassname/miniforge3/envs/glounts/lib/python3.9/site-packages/gluonts/dataset/multivariate_grouper.py:191: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
return {FieldName.TARGET: np.array([funcs(data) for data in dataset])}
In [12]:
int(dataset.metadata.feat_static_cat[0].cardinality)Out [12]:
370
In [13]:
int(dataset.metadata.feat_static_cat[0].cardinality)Out [13]:
370
In [57]:
estimator = TimeGradEstimator2(
target_dim=int(dataset.metadata.feat_static_cat[0].cardinality),
prediction_length=dataset.metadata.prediction_length,
context_length=dataset.metadata.prediction_length,
cell_type='GRU',
input_size=1484,
freq=dataset.metadata.freq,
loss_type='l2',
scaling=False,
diff_steps=100,
beta_end=0.1,
beta_schedule="linear",
trainer=Trainer(device=device,
epochs=20,
learning_rate=1e-3,
num_batches_per_epoch=100,
batch_size=64,)
)In [58]:
predictor = estimator.train(dataset_train, num_workers=0)
# predictor = estimator.train(dataset_train, num_workers=8)cond_length 100
0%| | 0/99 [00:00<?, ?it/s]
shapes torch.Size([64, 370, 48]) torch.Size([64]) torch.Size([64, 100, 48]) cond -> cond_up torch.Size([64, 100, 48]) torch.Size([64, 370, 48])
/media/wassname/SGIronWolf/projects5/timeseries/pytorch-ts/pts/model/time_grad2/gaussian_diffusion_ou.py:283: UserWarning: Using a target size (torch.Size([64, 1, 48])) that is different to the input size (torch.Size([64, 370, 46])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size. loss = F.mse_loss(x_recon, noise_rand)
[0;31m---------------------------------------------------------------------------[0m [0;31mRuntimeError[0m Traceback (most recent call last) Input [0;32mIn [58][0m, in [0;36m<cell line: 1>[0;34m()[0m [0;32m----> 1[0m predictor [38;5;241m=[39m [43mestimator[49m[38;5;241;43m.[39;49m[43mtrain[49m[43m([49m[43mdataset_train[49m[43m,[49m[43m [49m[43mnum_workers[49m[38;5;241;43m=[39;49m[38;5;241;43m0[39;49m[43m)[49m File [0;32m/media/wassname/SGIronWolf/projects5/timeseries/pytorch-ts/pts/model/estimator.py:179[0m, in [0;36mPyTorchEstimator.train[0;34m(self, training_data, validation_data, num_workers, prefetch_factor, shuffle_buffer_length, cache_data, **kwargs)[0m [1;32m 169[0m [38;5;28;01mdef[39;00m [38;5;21mtrain[39m( [1;32m 170[0m [38;5;28mself[39m, [1;32m 171[0m training_data: Dataset, [0;32m (...)[0m [1;32m 177[0m [38;5;241m*[39m[38;5;241m*[39mkwargs, [1;32m 178[0m ) [38;5;241m-[39m[38;5;241m>[39m PyTorchPredictor: [0;32m--> 179[0m [38;5;28;01mreturn[39;00m [38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43mtrain_model[49m[43m([49m [1;32m 180[0m [43m [49m[43mtraining_data[49m[43m,[49m [1;32m 181[0m [43m [49m[43mvalidation_data[49m[43m,[49m [1;32m 182[0m [43m [49m[43mnum_workers[49m[38;5;241;43m=[39;49m[43mnum_workers[49m[43m,[49m [1;32m 183[0m [43m [49m[43mprefetch_factor[49m[38;5;241;43m=[39;49m[43mprefetch_factor[49m[43m,[49m [1;32m 184[0m [43m [49m[43mshuffle_buffer_length[49m[38;5;241;43m=[39;49m[43mshuffle_buffer_length[49m[43m,[49m [1;32m 185[0m [43m [49m[43mcache_data[49m[38;5;241;43m=[39;49m[43mcache_data[49m[43m,[49m [1;32m 186[0m [43m [49m[38;5;241;43m*[39;49m[38;5;241;43m*[39;49m[43mkwargs[49m[43m,[49m [1;32m 187[0m [43m [49m[43m)[49m[38;5;241m.[39mpredictor File [0;32m/media/wassname/SGIronWolf/projects5/timeseries/pytorch-ts/pts/model/estimator.py:151[0m, in [0;36mPyTorchEstimator.train_model[0;34m(self, training_data, validation_data, num_workers, prefetch_factor, shuffle_buffer_length, cache_data, **kwargs)[0m [1;32m 133[0m validation_iter_dataset [38;5;241m=[39m TransformedIterableDataset( [1;32m 134[0m dataset[38;5;241m=[39mvalidation_data, [1;32m 135[0m transform[38;5;241m=[39mtransformation [0;32m (...)[0m [1;32m 139[0m cache_data[38;5;241m=[39mcache_data, [1;32m 140[0m ) [1;32m 141[0m validation_data_loader [38;5;241m=[39m DataLoader( [1;32m 142[0m validation_iter_dataset, [1;32m 143[0m batch_size[38;5;241m=[39m[38;5;28mself[39m[38;5;241m.[39mtrainer[38;5;241m.[39mbatch_size, [0;32m (...)[0m [1;32m 148[0m [38;5;241m*[39m[38;5;241m*[39mkwargs, [1;32m 149[0m ) [0;32m--> 151[0m [38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43mtrainer[49m[43m([49m [1;32m 152[0m [43m [49m[43mnet[49m[38;5;241;43m=[39;49m[43mtrained_net[49m[43m,[49m [1;32m 153[0m [43m [49m[43mtrain_iter[49m[38;5;241;43m=[39;49m[43mtraining_data_loader[49m[43m,[49m [1;32m 154[0m [43m [49m[43mvalidation_iter[49m[38;5;241;43m=[39;49m[43mvalidation_data_loader[49m[43m,[49m [1;32m 155[0m [43m[49m[43m)[49m [1;32m 157[0m [38;5;28;01mreturn[39;00m TrainOutput( [1;32m 158[0m transformation[38;5;241m=[39mtransformation, [1;32m 159[0m trained_net[38;5;241m=[39mtrained_net, [0;32m (...)[0m [1;32m 162[0m ), [1;32m 163[0m ) File [0;32m/media/wassname/SGIronWolf/projects5/timeseries/pytorch-ts/pts/trainer.py:67[0m, in [0;36mTrainer.__call__[0;34m(self, net, train_iter, validation_iter)[0m [1;32m 64[0m optimizer[38;5;241m.[39mzero_grad() [1;32m 66[0m inputs [38;5;241m=[39m [v[38;5;241m.[39mto([38;5;28mself[39m[38;5;241m.[39mdevice) [38;5;28;01mfor[39;00m v [38;5;129;01min[39;00m data_entry[38;5;241m.[39mvalues()] [0;32m---> 67[0m output [38;5;241m=[39m [43mnet[49m[43m([49m[38;5;241;43m*[39;49m[43minputs[49m[43m)[49m [1;32m 69[0m [38;5;28;01mif[39;00m [38;5;28misinstance[39m(output, ([38;5;28mlist[39m, [38;5;28mtuple[39m)): [1;32m 70[0m loss [38;5;241m=[39m output[[38;5;241m0[39m] File [0;32m~/miniforge3/envs/glounts/lib/python3.9/site-packages/torch/nn/modules/module.py:1190[0m, in [0;36mModule._call_impl[0;34m(self, *input, **kwargs)[0m [1;32m 1186[0m [38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in[39;00m [1;32m 1187[0m [38;5;66;03m# this function, and just call forward.[39;00m [1;32m 1188[0m [38;5;28;01mif[39;00m [38;5;129;01mnot[39;00m ([38;5;28mself[39m[38;5;241m.[39m_backward_hooks [38;5;129;01mor[39;00m [38;5;28mself[39m[38;5;241m.[39m_forward_hooks [38;5;129;01mor[39;00m [38;5;28mself[39m[38;5;241m.[39m_forward_pre_hooks [38;5;129;01mor[39;00m _global_backward_hooks [1;32m 1189[0m [38;5;129;01mor[39;00m _global_forward_hooks [38;5;129;01mor[39;00m _global_forward_pre_hooks): [0;32m-> 1190[0m [38;5;28;01mreturn[39;00m [43mforward_call[49m[43m([49m[38;5;241;43m*[39;49m[38;5;28;43minput[39;49m[43m,[49m[43m [49m[38;5;241;43m*[39;49m[38;5;241;43m*[39;49m[43mkwargs[49m[43m)[49m [1;32m 1191[0m [38;5;66;03m# Do not call functions when jit is used[39;00m [1;32m 1192[0m full_backward_hooks, non_full_backward_hooks [38;5;241m=[39m [], [] File [0;32m/media/wassname/SGIronWolf/projects5/timeseries/pytorch-ts/pts/model/time_grad2/time_grad_network.py:407[0m, in [0;36mTimeGradTrainingNetwork2.forward[0;34m(self, target_dimension_indicator, past_time_feat, past_target_cdf, past_observed_values, past_is_pad, future_time_feat, future_target_cdf, future_observed_values)[0m [1;32m 405[0m target [38;5;241m=[39m target[38;5;241m.[39mpermute([38;5;241m0[39m, [38;5;241m2[39m, [38;5;241m1[39m) [1;32m 406[0m distr_args [38;5;241m=[39m distr_args[38;5;241m.[39mpermute([38;5;241m0[39m, [38;5;241m2[39m, [38;5;241m1[39m) [0;32m--> 407[0m likelihoods [38;5;241m=[39m [38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43mdiffusion[49m[38;5;241;43m.[39;49m[43mlog_prob[49m[43m([49m[43mtarget[49m[43m,[49m[43m [49m[43mdistr_args[49m[43m)[49m[38;5;241m.[39munsqueeze([38;5;241m-[39m[38;5;241m1[39m) [1;32m 409[0m [38;5;66;03m# assert_shape(likelihoods, (-1, seq_len, 1))[39;00m [1;32m 411[0m past_observed_values [38;5;241m=[39m torch[38;5;241m.[39mmin( [1;32m 412[0m past_observed_values, [38;5;241m1[39m [38;5;241m-[39m past_is_pad[38;5;241m.[39munsqueeze([38;5;241m-[39m[38;5;241m1[39m) [1;32m 413[0m ) File [0;32m/media/wassname/SGIronWolf/projects5/timeseries/pytorch-ts/pts/model/time_grad2/gaussian_diffusion_ou.py:298[0m, in [0;36mGaussianDiffusionOU.log_prob[0;34m(self, x, cond, *args, **kwargs)[0m [1;32m 295[0m B, T, _ [38;5;241m=[39m x[38;5;241m.[39mshape [1;32m 297[0m time [38;5;241m=[39m torch[38;5;241m.[39mrandint([38;5;241m0[39m, [38;5;28mself[39m[38;5;241m.[39mnum_timesteps, (B,), device[38;5;241m=[39mx[38;5;241m.[39mdevice)[38;5;241m.[39mlong() [0;32m--> 298[0m loss [38;5;241m=[39m [38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43mp_losses[49m[43m([49m [1;32m 299[0m [43m [49m[43mx[49m[43m,[49m[43m [49m[43mcond[49m[43m,[49m[43m [49m[43mtime[49m[43m,[49m[43m [49m[38;5;241;43m*[39;49m[43margs[49m[43m,[49m[43m [49m[38;5;241;43m*[39;49m[38;5;241;43m*[39;49m[43mkwargs[49m [1;32m 300[0m [43m[49m[43m)[49m [1;32m 302[0m [38;5;28;01mreturn[39;00m loss File [0;32m/media/wassname/SGIronWolf/projects5/timeseries/pytorch-ts/pts/model/time_grad2/gaussian_diffusion_ou.py:283[0m, in [0;36mGaussianDiffusionOU.p_losses[0;34m(self, x_start, cond, t)[0m [1;32m 281[0m loss [38;5;241m=[39m F[38;5;241m.[39ml1_loss(x_recon, noise_rand) [1;32m 282[0m [38;5;28;01melif[39;00m [38;5;28mself[39m[38;5;241m.[39mloss_type [38;5;241m==[39m [38;5;124m"[39m[38;5;124ml2[39m[38;5;124m"[39m: [0;32m--> 283[0m loss [38;5;241m=[39m [43mF[49m[38;5;241;43m.[39;49m[43mmse_loss[49m[43m([49m[43mx_recon[49m[43m,[49m[43m [49m[43mnoise_rand[49m[43m)[49m [1;32m 284[0m [38;5;28;01melif[39;00m [38;5;28mself[39m[38;5;241m.[39mloss_type [38;5;241m==[39m [38;5;124m"[39m[38;5;124mhuber[39m[38;5;124m"[39m: [1;32m 285[0m loss [38;5;241m=[39m F[38;5;241m.[39msmooth_l1_loss(x_recon, noise_rand) File [0;32m~/miniforge3/envs/glounts/lib/python3.9/site-packages/torch/nn/functional.py:3291[0m, in [0;36mmse_loss[0;34m(input, target, size_average, reduce, reduction)[0m [1;32m 3288[0m [38;5;28;01mif[39;00m size_average [38;5;129;01mis[39;00m [38;5;129;01mnot[39;00m [38;5;28;01mNone[39;00m [38;5;129;01mor[39;00m reduce [38;5;129;01mis[39;00m [38;5;129;01mnot[39;00m [38;5;28;01mNone[39;00m: [1;32m 3289[0m reduction [38;5;241m=[39m _Reduction[38;5;241m.[39mlegacy_get_string(size_average, reduce) [0;32m-> 3291[0m expanded_input, expanded_target [38;5;241m=[39m [43mtorch[49m[38;5;241;43m.[39;49m[43mbroadcast_tensors[49m[43m([49m[38;5;28;43minput[39;49m[43m,[49m[43m [49m[43mtarget[49m[43m)[49m [1;32m 3292[0m [38;5;28;01mreturn[39;00m torch[38;5;241m.[39m_C[38;5;241m.[39m_nn[38;5;241m.[39mmse_loss(expanded_input, expanded_target, _Reduction[38;5;241m.[39mget_enum(reduction)) File [0;32m~/miniforge3/envs/glounts/lib/python3.9/site-packages/torch/functional.py:74[0m, in [0;36mbroadcast_tensors[0;34m(*tensors)[0m [1;32m 72[0m [38;5;28;01mif[39;00m has_torch_function(tensors): [1;32m 73[0m [38;5;28;01mreturn[39;00m handle_torch_function(broadcast_tensors, tensors, [38;5;241m*[39mtensors) [0;32m---> 74[0m [38;5;28;01mreturn[39;00m [43m_VF[49m[38;5;241;43m.[39;49m[43mbroadcast_tensors[49m[43m([49m[43mtensors[49m[43m)[49m [0;31mRuntimeError[0m: The size of tensor a (46) must match the size of tensor b (48) at non-singleton dimension 2
In [ ]:
%debug> [0;32m/home/wassname/miniforge3/envs/glounts/lib/python3.9/site-packages/torch/functional.py[0m(74)[0;36mbroadcast_tensors[0;34m()[0m [0;32m 72 [0;31m [0;32mif[0m [0mhas_torch_function[0m[0;34m([0m[0mtensors[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m 73 [0;31m [0;32mreturn[0m [0mhandle_torch_function[0m[0;34m([0m[0mbroadcast_tensors[0m[0;34m,[0m [0mtensors[0m[0;34m,[0m [0;34m*[0m[0mtensors[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m---> 74 [0;31m [0;32mreturn[0m [0m_VF[0m[0;34m.[0m[0mbroadcast_tensors[0m[0;34m([0m[0mtensors[0m[0;34m)[0m [0;31m# type: ignore[attr-defined][0m[0;34m[0m[0;34m[0m[0m [0m[0;32m 75 [0;31m[0;34m[0m[0m [0m[0;32m 76 [0;31m[0;34m[0m[0m [0m ipdb> u > [0;32m/home/wassname/miniforge3/envs/glounts/lib/python3.9/site-packages/torch/nn/functional.py[0m(3291)[0;36mmse_loss[0;34m()[0m [0;32m 3289 [0;31m [0mreduction[0m [0;34m=[0m [0m_Reduction[0m[0;34m.[0m[0mlegacy_get_string[0m[0;34m([0m[0msize_average[0m[0;34m,[0m [0mreduce[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m 3290 [0;31m[0;34m[0m[0m [0m[0;32m-> 3291 [0;31m [0mexpanded_input[0m[0;34m,[0m [0mexpanded_target[0m [0;34m=[0m [0mtorch[0m[0;34m.[0m[0mbroadcast_tensors[0m[0;34m([0m[0minput[0m[0;34m,[0m [0mtarget[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m 3292 [0;31m [0;32mreturn[0m [0mtorch[0m[0;34m.[0m[0m_C[0m[0;34m.[0m[0m_nn[0m[0;34m.[0m[0mmse_loss[0m[0;34m([0m[0mexpanded_input[0m[0;34m,[0m [0mexpanded_target[0m[0;34m,[0m [0m_Reduction[0m[0;34m.[0m[0mget_enum[0m[0;34m([0m[0mreduction[0m[0;34m)[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m 3293 [0;31m[0;34m[0m[0m [0m ipdb> u > [0;32m/media/wassname/SGIronWolf/projects5/timeseries/pytorch-ts/pts/model/time_grad2/gaussian_diffusion_ou.py[0m(283)[0;36mp_losses[0;34m()[0m [0;32m 281 [0;31m [0mloss[0m [0;34m=[0m [0mF[0m[0;34m.[0m[0ml1_loss[0m[0;34m([0m[0mx_recon[0m[0;34m,[0m [0mnoise_rand[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m 282 [0;31m [0;32melif[0m [0mself[0m[0;34m.[0m[0mloss_type[0m [0;34m==[0m [0;34m"l2"[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m--> 283 [0;31m [0mloss[0m [0;34m=[0m [0mF[0m[0;34m.[0m[0mmse_loss[0m[0;34m([0m[0mx_recon[0m[0;34m,[0m [0mnoise_rand[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m 284 [0;31m [0;32melif[0m [0mself[0m[0;34m.[0m[0mloss_type[0m [0;34m==[0m [0;34m"huber"[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m 285 [0;31m [0mloss[0m [0;34m=[0m [0mF[0m[0;34m.[0m[0msmooth_l1_loss[0m[0;34m([0m[0mx_recon[0m[0;34m,[0m [0mnoise_rand[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m ipdb> u > [0;32m/media/wassname/SGIronWolf/projects5/timeseries/pytorch-ts/pts/model/time_grad2/gaussian_diffusion_ou.py[0m(298)[0;36mlog_prob[0;34m()[0m [0;32m 296 [0;31m[0;34m[0m[0m [0m[0;32m 297 [0;31m [0mtime[0m [0;34m=[0m [0mtorch[0m[0;34m.[0m[0mrandint[0m[0;34m([0m[0;36m0[0m[0;34m,[0m [0mself[0m[0;34m.[0m[0mnum_timesteps[0m[0;34m,[0m [0;34m([0m[0mB[0m[0;34m,[0m[0;34m)[0m[0;34m,[0m [0mdevice[0m[0;34m=[0m[0mx[0m[0;34m.[0m[0mdevice[0m[0;34m)[0m[0;34m.[0m[0mlong[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m--> 298 [0;31m loss = self.p_losses( [0m[0;32m 299 [0;31m [0mx[0m[0;34m,[0m [0mcond[0m[0;34m,[0m [0mtime[0m[0;34m,[0m [0;34m*[0m[0margs[0m[0;34m,[0m [0;34m**[0m[0mkwargs[0m[0;34m[0m[0;34m[0m[0m [0m[0;32m 300 [0;31m ) [0m ipdb> x.shape torch.Size([64, 370, 48]) ipdb> cond.shape torch.Size([64, 100, 48]) ipdb> time.shape torch.Size([64])
In [ ]:
forecast_it, ts_it = make_evaluation_predictions(dataset=dataset_test,
predictor=predictor,
num_samples=100)In [ ]:
forecasts = list(forecast_it)
targets = list(ts_it)In [ ]:
plot(
target=targets[0],
forecast=forecasts[0],
prediction_length=dataset.metadata.prediction_length,
)
plt.show()In [ ]:
evaluator = MultivariateEvaluator(quantiles=(np.arange(20)/20.0)[1:],
target_agg_funcs={'sum': np.sum})In [ ]:
agg_metric, item_metrics = evaluator(targets, forecasts, num_series=len(dataset_test))In [ ]:
print("CRPS:", agg_metric["mean_wQuantileLoss"])
print("ND:", agg_metric["ND"])
print("NRMSE:", agg_metric["NRMSE"])
print("")
print("CRPS-Sum:", agg_metric["m_sum_mean_wQuantileLoss"])
print("ND-Sum:", agg_metric["m_sum_ND"])
print("NRMSE-Sum:", agg_metric["m_sum_NRMSE"])In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
predictor = estimator.train(dataset_train, num_workers=0)In [ ]:
%debugIn [ ]:
from tqdm.auto import tqdmIn [ ]:
transformation = estimator.create_transformation()
training_instance_splitter = estimator.create_instance_splitter("training")
In [ ]:
g1 = trans.apply(dataset_train, is_train=True)
b = next(iter(g1))
b.keys()In [ ]:
for _ in tqdm(g1):
passIn [ ]:
transform = transformation + training_instance_splitter
g2 = transform.apply(dataset_train, is_train=True)
gg = iter(g2)
b = next(gg)
b.keys()In [ ]:
for _ in tqdm(g2):
passIn [ ]:
b = next(gg)
b.keys()In [ ]:
from pts.model import get_module_forward_input_names
from gluonts.transform import SelectFields, Transformation
trained_net = estimator.create_training_network(estimator.trainer.device)
input_names = get_module_forward_input_names(trained_net)
transform = transformation + training_instance_splitter + SelectFields(input_names)
g = transform.apply(dataset_train, is_train=True)
b = next(iter(g))
b.keys()In [ ]:
In [ ]:
from pts.dataset.loader import TransformedIterableDataset
training_data = dataset_train
training_iter_dataset = TransformedIterableDataset(
dataset=training_data,
transform=transformation
+ training_instance_splitter
+ SelectFields(input_names),
is_train=True,
shuffle_buffer_length=None,
# cache_data=cache_data,
)
training_iter_datasetIn [ ]:
next(iter(training_iter_dataset))In [ ]:
from torch.utils.data import DataLoader
training_data_loader = DataLoader(
training_iter_dataset,
batch_size=estimator.trainer.batch_size,
num_workers=0,
# prefetch_factor=prefetch_factor,
pin_memory=True,
worker_init_fn=estimator._worker_init_fn,
# **kwargs,
)In [ ]:
next(iter(training_data_loader))In [ ]:
for b in tqdm(training_data_loader):
passIn [ ]: