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:, :]