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]