看到外网的帖子
towardsdatascience.com/how-to-make…
towardsdatascience.com/how-to-run-…
但是他这里是预测一个再加回来到 dec_input 然后再把这个延长的 dec_input 传回模型预测下一个值
我希望能够做的是像这种能够输入 enc_len_size 长度的向量,输出 dec_len_size 长度的向量的
于是我就把他的改了一下,发在 github 上
主要是在 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 的,实线是预测值,虚线是真实值,看上去很拟合,我也不知道是否过拟合……
总之能跑!