TensorFlow搭建LSTM实现多变量多步长时间序列预测(五):seq2seq

目录

  • I. 前言
  • II. seq2seq
  • III. 代码实现
    • 3.1 数据处理
    • 3.2 模型搭建
    • 3.3 模型训练/测试
    • 3.4 实验结果
  • IV. 源码及数据

I. 前言

系列文章:

  1. 深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)
  2. PyTorch搭建LSTM实现时间序列预测(负荷预测)
  3. PyTorch搭建LSTM实现多变量时间序列预测(负荷预测)
  4. PyTorch搭建双向LSTM实现时间序列预测(负荷预测)
  5. PyTorch搭建LSTM实现多变量多步长时间序列预测(一):直接多输出
  6. PyTorch搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
  7. PyTorch搭建LSTM实现多变量多步长时间序列预测(三):多模型单步预测
  8. PyTorch搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测
  9. PyTorch搭建LSTM实现多变量多步长时间序列预测(五):seq2seq
  10. PyTorch中实现LSTM多步长时间序列预测的几种方法总结(负荷预测)
  11. PyTorch-LSTM时间序列预测中如何预测真正的未来值
  12. PyTorch搭建LSTM实现多变量输入多变量输出时间序列预测(多任务学习)
  13. PyTorch搭建ANN实现时间序列预测(风速预测)
  14. PyTorch搭建CNN实现时间序列预测(风速预测)
  15. PyTorch搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)
  16. PyTorch搭建Transformer实现多变量多步长时间序列预测(负荷预测)
  17. PyTorch时间序列预测系列文章总结(代码使用方法)
  18. TensorFlow搭建LSTM实现时间序列预测(负荷预测)
  19. TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)
  20. TensorFlow搭建双向LSTM实现时间序列预测(负荷预测)
  21. TensorFlow搭建LSTM实现多变量多步长时间序列预测(一):直接多输出
  22. TensorFlow搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
  23. TensorFlow搭建LSTM实现多变量多步长时间序列预测(三):多模型单步预测
  24. TensorFlow搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测
  25. TensorFlow搭建LSTM实现多变量多步长时间序列预测(五):seq2seq
  26. TensorFlow搭建LSTM实现多变量输入多变量输出时间序列预测(多任务学习)
  27. TensorFlow搭建ANN实现时间序列预测(风速预测)
  28. TensorFlow搭建CNN实现时间序列预测(风速预测)
  29. TensorFlow搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)

II. seq2seq

seq2seq由两部分组成:Encoder和Decoder。seq2seq的输入是一个序列,输出也是一个序列,经常用于时间序列预测。关于seq2seq的具体原理可以参考:DL入门(3):循环神经网络(RNN)。

III. 代码实现

3.1 数据处理

我们根据前24个时刻的负荷以及该时刻的环境变量来预测接下来12个时刻的负荷(步长pred_step_size可调)。

数据处理代码和前面的直接多输出预测一致。

3.2 模型搭建

模型搭建分为三个步骤:编码器、解码器以及seq2seq。

首先是Encoder:

class Encoder(keras.Model):
    def __init__(self, args):
        super().__init__()
        self.lstm = layers.LSTM(units=args.hidden_size, input_shape=(args.seq_len, args.input_size),
                                activation='tanh', return_sequences=True, return_state=True)

    def call(self, input_seq):
        output, h, c = self.lstm(input_seq)

        return h, c

一般来讲编码器采用的就是RNN网络,这里采用了LSTM将原始数据进行编码,然后将LSTM的最后的隐状态和单元状态返回。

接着是解码器Decoder:

class Decoder(keras.Model):
    def __init__(self, args):
        super().__init__()
        self.lstm = layers.LSTM(units=args.hidden_size, input_shape=(args.seq_len, args.input_size),
                                activation='tanh', return_sequences=True, return_state=True)
        self.fc1 = layers.Dense(64, activation='relu')
        self.fc2 = layers.Dense(args.output_size)

    def call(self, input_seq, h, c):
        # input_seq(batch_size, input_size)
        batch_size, input_size = input_seq.shape[0], input_seq.shape[1]
        input_seq = tf.reshape(input_seq, [batch_size, 1, input_size])
        output, h, c = self.lstm(input_seq, initial_state=[h, c])
        # output(batch_size, seq_len, num * hidden_size)
        pred = self.fc1(output)  # pred(batch_size, 1, output_size)
        pred = self.fc2(pred)
        pred = pred[:, -1, :]

        return pred, h, c

解码器同样也由LSTM组成,不过解码器的初始的隐状态和单元状态是编码器的输出。此外,解码器每次只输入seq_len中的一个。

最后定义seq2seq:

class Seq2Seq(keras.Model):
    def __init__(self, args):
        super().__init__()
        self.args = args
        self.Encoder = Encoder(args)
        self.Decoder = Decoder(args)

    def call(self, input_seq):
        batch_size, seq_len, _ = input_seq.shape[0], input_seq.shape[1], input_seq.shape[2]
        h, c = self.Encoder(input_seq)
        res = None
        for t in range(seq_len):
            _input = input_seq[:, t, :]
            output, h, c = self.Decoder(_input, h, c)
            res = output

        return res

seq2seq中,将24个时刻的的数据依次迭代输入解码器。

3.3 模型训练/测试

模型训练和测试同前文一致。

3.4 实验结果

前24个预测未来12个,每个模型训练30轮,MAPE为9.36%,还需要进一步完善。
TensorFlow搭建LSTM实现多变量多步长时间序列预测(五):seq2seq_第1张图片

IV. 源码及数据

后面将陆续公开~

你可能感兴趣的:(时间序列预测,TensorFlow,tensorflow,lstm,时间序列预测,负荷预测,seq2seq)