Source code for deep_time_series.layer

import math

import torch
import torch.nn as nn


[docs]class Unsqueesze(nn.Module): def __init__(self, dim): super().__init__() self.dim = dim def forward(self, x): return x.unsqueeze(self.dim)
[docs]class Permute(nn.Module): def __init__(self, *dims): super().__init__() self.dims = dims def forward(self, x): return x.permute(*self.dims)
[docs]class LeftPadding1D(nn.Module): def __init__(self, padding_size): super().__init__() self.padding_size = padding_size def forward(self, x): # x: (B, L, C). B = x.size(0) C = x.size(2) padding = torch.zeros( B, self.padding_size, C, dtype=x.dtype, device=x.device ) y = torch.cat([padding, x], axis=1) return y
# Modified from: # https://pytorch.org/tutorials/beginner/transformer_tutorial.html. # Modifications # 1. Dropout functionality is removed. # 2. Changed to batch_first format.
[docs]class PositionalEncoding(nn.Module): def __init__(self, d_model, max_len): super().__init__() position = torch.arange(max_len).unsqueeze(1) div_term = torch.exp( torch.arange(0, d_model, 2) * (-math.log(10000.0) / d_model) ) pe = torch.zeros(max_len, 1, d_model) pe[:, 0, 0::2] = torch.sin(position * div_term) pe[:, 0, 1::2] = torch.cos(position * div_term) # Change to batch_first format. pe = pe.permute((1, 0, 2)) self.register_buffer('pe', pe) def forward(self, x): # x: (B, L, F). x = x + self.pe[:, : x.size(1), :] return x