使用 Transformer 做多维输入输出的时间预测

614 阅读1分钟

看到外网的帖子

towardsdatascience.com/how-to-make…

towardsdatascience.com/how-to-run-…

但是他这里是预测一个再加回来到 dec_input 然后再把这个延长的 dec_input 传回模型预测下一个值

图片.png

我希望能够做的是像这种能够输入 enc_len_size 长度的向量,输出 dec_len_size 长度的向量的

blog.csdn.net/u013177138/…

于是我就把他的改了一下,发在 github 上

github.com/CheapMeow/T…

主要是在 data_loader 方面做了注释,怎么取数据啊之类的,但是这个东西具体每个人都有自己的 data_loader,所以就不好统一说了

反正我这个就是单纯的一行一行读

然后其实网络架构很简单,就是线性层进去,特征长度变 d_model,送进 transformer 模块,出来经过线性层,特征长度再变回来

def __init__(self,...):
    super(TransformerTS, self).__init__()
    self.transform = nn.Transformer(
        ...
    )
    self.pos = PositionalEncoding(d_model)
    self.enc_input_fc = nn.Linear(enc_feature_size, d_model)
    self.dec_input_fc = nn.Linear(dec_feature_size, d_model)
    self.out_fc = nn.Linear(d_model, dec_feature_size)

def forward(self, enc_input, dec_input):
    # embed_encoder_input: [enc_seq_len, enc_feature_size] -> [enc_seq_len, d_model]
    embed_encoder_input = self.pos(self.enc_input_fc(enc_input))

    # embed_decoder_input: [dec_seq_len, dec_feature_size] -> [dec_seq_len, d_model]
    embed_decoder_input = self.dec_input_fc(dec_input)

    # x: [dec_seq_len, d_model]
    x = self.transform(embed_encoder_input, embed_decoder_input)

    # x: [dec_seq_len, d_model] -> [dec_seq_len, dec_feature_size]
    x = self.out_fc(x)

    return x

我用的是预测 sin 的,实线是预测值,虚线是真实值,看上去很拟合,我也不知道是否过拟合……

总之能跑!

图片.png