Source code for RADAR.time_series.algorithms.modelsTransformersTS.autoformer.model

import torch
import torch.nn as nn
from .embed import DataEmbedding
from .attn import AutoCorrelation, AutoCorrelationLayer
from .encoder import Encoder, EncoderLayer
from .decoder import Decoder, DecoderLayer
from .endec  import  my_Layernorm, series_decomp

import torch
import torch.nn as nn

[docs] class Autoformer(nn.Module): """ Autoformer is the first method to achieve the series-wise connection, with inherent O(LlogL) complexity. """ def __init__(self, seq_len, label_len, pred_len, enc_in, dec_in, c_out, d_model, n_heads, e_layers, d_layers, d_ff, moving_avg, factor, dropout, activation, output_attention): super(Autoformer, self).__init__() # Guardar parĂ¡metros self.seq_len = seq_len self.label_len = label_len self.pred_len = pred_len self.enc_in = enc_in self.dec_in = dec_in self.c_out = c_out self.d_model = d_model self.n_heads = n_heads self.e_layers = e_layers self.d_layers = d_layers self.d_ff = d_ff self.moving_avg = moving_avg self.factor = factor self.dropout = dropout self.activation = activation self.output_attention = output_attention # Decomposition self.decomp = series_decomp(moving_avg) # Embedding self.enc_embedding = DataEmbedding(enc_in, d_model, dropout) self.dec_embedding = DataEmbedding(dec_in, d_model, dropout) # Encoder self.encoder = Encoder( [ EncoderLayer( AutoCorrelationLayer( AutoCorrelation(False, factor, attention_dropout=dropout, output_attention=output_attention), d_model, n_heads), d_model, d_ff, moving_avg=moving_avg, dropout=dropout, activation=activation ) for _ in range(e_layers) ], norm_layer=my_Layernorm(d_model) ) # Decoder self.decoder = Decoder( [ DecoderLayer( AutoCorrelationLayer( AutoCorrelation(True, factor, attention_dropout=dropout, output_attention=False), d_model, n_heads), AutoCorrelationLayer( AutoCorrelation(False, factor, attention_dropout=dropout, output_attention=False), d_model, n_heads), d_model, c_out, d_ff, moving_avg=moving_avg, dropout=dropout, activation=activation ) for _ in range(d_layers) ], norm_layer=my_Layernorm(d_model), projection=nn.Linear(d_model, c_out, bias=True) )
[docs] def forward(self, x_enc, x_dec, enc_self_mask=None, dec_self_mask=None, dec_enc_mask=None): # decomp init mean = torch.mean(x_enc, dim=1).unsqueeze(1).repeat(1, self.pred_len, 1) zeros = torch.zeros([x_dec.shape[0], self.pred_len, x_dec.shape[2]], device=x_enc.device) seasonal_init, trend_init = self.decomp(x_enc) # decoder input trend_init = torch.cat([trend_init[:, -self.label_len:, :], mean], dim=1) seasonal_init = torch.cat([seasonal_init[:, -self.label_len:, :], zeros], dim=1) # encoder enc_out = self.enc_embedding(x_enc) enc_out, attns = self.encoder(enc_out, attn_mask=enc_self_mask) # decoder dec_out = self.dec_embedding(seasonal_init) seasonal_part, trend_part = self.decoder(dec_out, enc_out, x_mask=dec_self_mask, cross_mask=dec_enc_mask, trend=trend_init) # final output dec_out = trend_part + seasonal_part if self.output_attention: return dec_out[:, -self.pred_len:, :], attns else: return dec_out[:, -self.pred_len:, :]