From 67398a8e67f11136d01244dd440fddd172244b99 Mon Sep 17 00:00:00 2001 From: "Dr. Kashif Rasul" Date: Fri, 22 May 2020 09:42:49 +0200 Subject: [PATCH 1/4] Use buffers Instead of parameters with grad=False, buffers is the way to go. --- models/nbeats.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/models/nbeats.py b/models/nbeats.py index e55fbf0..4a68a2e 100644 --- a/models/nbeats.py +++ b/models/nbeats.py @@ -94,13 +94,12 @@ class TrendBasis(t.nn.Module): def __init__(self, degree_of_polynomial: int, backcast_size: int, forecast_size: int): super().__init__() self.polynomial_size = degree_of_polynomial + 1 # degree of polynomial with constant term - self.backcast_time = t.nn.Parameter( + self.register_buffer('backcast_time', t.tensor(np.concatenate([np.power(np.arange(backcast_size, dtype=np.float) / backcast_size, i)[None, :] - for i in range(self.polynomial_size)]), dtype=t.float32), - requires_grad=False) - self.forecast_time = t.nn.Parameter( + for i in range(self.polynomial_size)]), dtype=t.float32)) + self.register_buffer('forecast_time', t.tensor(np.concatenate([np.power(np.arange(forecast_size, dtype=np.float) / forecast_size, i)[None, :] - for i in range(self.polynomial_size)]), dtype=t.float32), requires_grad=False) + for i in range(self.polynomial_size)]), dtype=t.float32)) def forward(self, theta: t.Tensor): backcast = t.einsum('bp,pt->bt', theta[:, self.polynomial_size:], self.backcast_time) @@ -121,14 +120,10 @@ def __init__(self, harmonics: int, backcast_size: int, forecast_size: int): np.arange(backcast_size, dtype=np.float32)[:, None] / forecast_size) * self.frequency forecast_grid = 2 * np.pi * ( np.arange(forecast_size, dtype=np.float32)[:, None] / forecast_size) * self.frequency - self.backcast_cos_template = t.nn.Parameter(t.tensor(np.transpose(np.cos(backcast_grid)), dtype=t.float32), - requires_grad=False) - self.backcast_sin_template = t.nn.Parameter(t.tensor(np.transpose(np.sin(backcast_grid)), dtype=t.float32), - requires_grad=False) - self.forecast_cos_template = t.nn.Parameter(t.tensor(np.transpose(np.cos(forecast_grid)), dtype=t.float32), - requires_grad=False) - self.forecast_sin_template = t.nn.Parameter(t.tensor(np.transpose(np.sin(forecast_grid)), dtype=t.float32), - requires_grad=False) + self.register_buffer('backcast_cos_template', t.tensor(np.transpose(np.cos(backcast_grid)), dtype=t.float32)) + self.register_buffer('backcast_cos_template', t.tensor(np.transpose(np.sin(backcast_grid)), dtype=t.float32)) + self.register_buffer('forecast_cos_template', t.tensor(np.transpose(np.cos(forecast_grid)), dtype=t.float32)) + self.register_buffer('forecast_sin_template', t.tensor(np.transpose(np.sin(forecast_grid)), dtype=t.float32)) def forward(self, theta: t.Tensor): params_per_harmonic = theta.shape[1] // 4 From 5fa71aa2fa609519c4155ecaf9a7ca822dc2600e Mon Sep 17 00:00:00 2001 From: "Dr. Kashif Rasul" Date: Fri, 22 May 2020 09:56:58 +0200 Subject: [PATCH 2/4] fix typo --- models/nbeats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/nbeats.py b/models/nbeats.py index 4a68a2e..2645212 100644 --- a/models/nbeats.py +++ b/models/nbeats.py @@ -121,7 +121,7 @@ def __init__(self, harmonics: int, backcast_size: int, forecast_size: int): forecast_grid = 2 * np.pi * ( np.arange(forecast_size, dtype=np.float32)[:, None] / forecast_size) * self.frequency self.register_buffer('backcast_cos_template', t.tensor(np.transpose(np.cos(backcast_grid)), dtype=t.float32)) - self.register_buffer('backcast_cos_template', t.tensor(np.transpose(np.sin(backcast_grid)), dtype=t.float32)) + self.register_buffer('backcast_sin_template', t.tensor(np.transpose(np.sin(backcast_grid)), dtype=t.float32)) self.register_buffer('forecast_cos_template', t.tensor(np.transpose(np.cos(forecast_grid)), dtype=t.float32)) self.register_buffer('forecast_sin_template', t.tensor(np.transpose(np.sin(forecast_grid)), dtype=t.float32)) From f8e7dc8340e65a961e8ba7bcde5e0da8e7378aed Mon Sep 17 00:00:00 2001 From: "Dr. Kashif Rasul" Date: Fri, 22 May 2020 13:27:24 +0200 Subject: [PATCH 3/4] get rid of the pesky dtypes torch.Tensor will return float32 tensors --- models/nbeats.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/models/nbeats.py b/models/nbeats.py index 2645212..d7eafc7 100644 --- a/models/nbeats.py +++ b/models/nbeats.py @@ -95,11 +95,11 @@ def __init__(self, degree_of_polynomial: int, backcast_size: int, forecast_size: super().__init__() self.polynomial_size = degree_of_polynomial + 1 # degree of polynomial with constant term self.register_buffer('backcast_time', - t.tensor(np.concatenate([np.power(np.arange(backcast_size, dtype=np.float) / backcast_size, i)[None, :] - for i in range(self.polynomial_size)]), dtype=t.float32)) + t.Tensor(np.concatenate([np.power(np.arange(backcast_size) / backcast_size, i)[None, :] + for i in range(self.polynomial_size)]))) self.register_buffer('forecast_time', - t.tensor(np.concatenate([np.power(np.arange(forecast_size, dtype=np.float) / forecast_size, i)[None, :] - for i in range(self.polynomial_size)]), dtype=t.float32)) + t.Tensor(np.concatenate([np.power(np.arange(forecast_size) / forecast_size, i)[None, :] + for i in range(self.polynomial_size)]))) def forward(self, theta: t.Tensor): backcast = t.einsum('bp,pt->bt', theta[:, self.polynomial_size:], self.backcast_time) @@ -113,17 +113,16 @@ class SeasonalityBasis(t.nn.Module): """ def __init__(self, harmonics: int, backcast_size: int, forecast_size: int): super().__init__() - self.frequency = np.append(np.zeros(1, dtype=np.float32), - np.arange(harmonics, harmonics / 2 * forecast_size, - dtype=np.float32) / harmonics)[None, :] + self.frequency = np.append(np.zeros(1), + np.arange(harmonics, harmonics / 2 * forecast_size) / harmonics)[None, :] backcast_grid = -2 * np.pi * ( - np.arange(backcast_size, dtype=np.float32)[:, None] / forecast_size) * self.frequency + np.arange(backcast_size)[:, None] / forecast_size) * self.frequency forecast_grid = 2 * np.pi * ( - np.arange(forecast_size, dtype=np.float32)[:, None] / forecast_size) * self.frequency - self.register_buffer('backcast_cos_template', t.tensor(np.transpose(np.cos(backcast_grid)), dtype=t.float32)) - self.register_buffer('backcast_sin_template', t.tensor(np.transpose(np.sin(backcast_grid)), dtype=t.float32)) - self.register_buffer('forecast_cos_template', t.tensor(np.transpose(np.cos(forecast_grid)), dtype=t.float32)) - self.register_buffer('forecast_sin_template', t.tensor(np.transpose(np.sin(forecast_grid)), dtype=t.float32)) + np.arange(forecast_size)[:, None] / forecast_size) * self.frequency + self.register_buffer('backcast_cos_template', t.Tensor(np.transpose(np.cos(backcast_grid)))) + self.register_buffer('backcast_sin_template', t.Tensor(np.transpose(np.sin(backcast_grid)))) + self.register_buffer('forecast_cos_template', t.Tensor(np.transpose(np.cos(forecast_grid)))) + self.register_buffer('forecast_sin_template', t.Tensor(np.transpose(np.sin(forecast_grid)))) def forward(self, theta: t.Tensor): params_per_harmonic = theta.shape[1] // 4 From 76a665e6d3d16f016e15917d0c04f4ebd8407b5f Mon Sep 17 00:00:00 2001 From: "Dr. Kashif Rasul" Date: Sat, 23 May 2020 09:33:07 +0200 Subject: [PATCH 4/4] no need for instance variable --- models/nbeats.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/models/nbeats.py b/models/nbeats.py index d7eafc7..ef88cb1 100644 --- a/models/nbeats.py +++ b/models/nbeats.py @@ -113,12 +113,12 @@ class SeasonalityBasis(t.nn.Module): """ def __init__(self, harmonics: int, backcast_size: int, forecast_size: int): super().__init__() - self.frequency = np.append(np.zeros(1), - np.arange(harmonics, harmonics / 2 * forecast_size) / harmonics)[None, :] + frequency = np.append(np.zeros(1), + np.arange(harmonics, harmonics / 2 * forecast_size) / harmonics)[None, :] backcast_grid = -2 * np.pi * ( - np.arange(backcast_size)[:, None] / forecast_size) * self.frequency + np.arange(backcast_size)[:, None] / forecast_size) * frequency forecast_grid = 2 * np.pi * ( - np.arange(forecast_size)[:, None] / forecast_size) * self.frequency + np.arange(forecast_size)[:, None] / forecast_size) * frequency self.register_buffer('backcast_cos_template', t.Tensor(np.transpose(np.cos(backcast_grid)))) self.register_buffer('backcast_sin_template', t.Tensor(np.transpose(np.sin(backcast_grid)))) self.register_buffer('forecast_cos_template', t.Tensor(np.transpose(np.cos(forecast_grid))))