Source code for ltsm.models.Informer

# code from https://github.com/yuqinie98/PatchTST, with minor modifications
import torch
from torch import Tensor
import torch.nn as nn
import torch.nn.functional as F
from ltsm.utils.masking import TriangularCausalMask, ProbMask
from ltsm.layers.Transformer_EncDec import Decoder, DecoderLayer, Encoder, EncoderLayer, ConvLayer
from ltsm.layers.SelfAttention_Family import FullAttention, ProbAttention, AttentionLayer
from ltsm.layers.Embed import DataEmbedding,DataEmbedding_wo_pos,DataEmbedding_wo_temp,DataEmbedding_wo_pos_temp
import numpy as np
from transformers import PreTrainedModel
from .base_config import InformerConfig

[docs] class Informer(PreTrainedModel): """ Informer with Propspare attention in O(LlogL) complexity """ config_class = InformerConfig def __init__(self, config: InformerConfig, **kwargs): super().__init__(config) self.pred_len = config.pred_len self.output_attention = config.output_attention # Embedding if config.embed_type == 0: self.enc_embedding = DataEmbedding(config.enc_in, config.d_model, config.embed, config.freq, config.dropout) self.dec_embedding = DataEmbedding(config.dec_in, config.d_model, config.embed, config.freq, config.dropout) elif config.embed_type == 1: self.enc_embedding = DataEmbedding(config.enc_in, config.d_model, config.embed, config.freq, config.dropout) self.dec_embedding = DataEmbedding(config.dec_in, config.d_model, config.embed, config.freq, config.dropout) elif config.embed_type == 2: self.enc_embedding = DataEmbedding_wo_pos(config.enc_in, config.d_model, config.embed, config.freq, config.dropout) self.dec_embedding = DataEmbedding_wo_pos(config.dec_in, config.d_model, config.embed, config.freq, config.dropout) elif config.embed_type == 3: self.enc_embedding = DataEmbedding_wo_temp(config.enc_in, config.d_model, config.embed, config.freq, config.dropout) self.dec_embedding = DataEmbedding_wo_temp(config.dec_in, config.d_model, config.embed, config.freq, config.dropout) elif config.embed_type == 4: self.enc_embedding = DataEmbedding_wo_pos_temp(config.enc_in, config.d_model, config.embed, config.freq, config.dropout) self.dec_embedding = DataEmbedding_wo_pos_temp(config.dec_in, config.d_model, config.embed, config.freq, config.dropout) # Encoder self.encoder = Encoder( [ EncoderLayer( AttentionLayer( ProbAttention(False, config.factor, attention_dropout=config.dropout, output_attention=config.output_attention), config.d_model, config.n_heads), config.d_model, config.d_ff, dropout=config.dropout, activation=config.activation ) for l in range(config.e_layers) ], [ ConvLayer( config.d_model ) for l in range(config.e_layers - 1) ] if config.distil else None, norm_layer=torch.nn.LayerNorm(config.d_model) ) # Decoder self.decoder = Decoder( [ DecoderLayer( AttentionLayer( ProbAttention(True, config.factor, attention_dropout=config.dropout, output_attention=False), config.d_model, config.n_heads), AttentionLayer( ProbAttention(False, config.factor, attention_dropout=config.dropout, output_attention=False), config.d_model, config.n_heads), config.d_model, config.d_ff, dropout=config.dropout, activation=config.activation, ) for l in range(config.d_layers) ], norm_layer=torch.nn.LayerNorm(config.d_model), projection=nn.Linear(config.d_model, config.c_out, bias=True) )
[docs] def forward(self, x_enc: Tensor, x_mark_enc: Tensor, x_dec: Tensor, x_mark_dec: Tensor, enc_self_mask: Tensor=None, dec_self_mask: Tensor=None, dec_enc_mask: Tensor=None): enc_out = self.enc_embedding(x_enc, x_mark_enc) enc_out, attns = self.encoder(enc_out, attn_mask=enc_self_mask) dec_out = self.dec_embedding(x_dec, x_mark_dec) dec_out = self.decoder(dec_out, enc_out, x_mask=dec_self_mask, cross_mask=dec_enc_mask) if self.output_attention: return dec_out[:, -self.pred_len:, :], attns else: return dec_out[:, -self.pred_len:, :] # [B, L, D]