TensorFlow搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)

I. 前言

前面已经写了很多关于时间序列预测的文章:

  1. 深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)
  2. PyTorch搭建LSTM实现时间序列预测(负荷预测)
  3. PyTorch中利用LSTMCell搭建多层LSTM实现时间序列预测
  4. PyTorch搭建LSTM实现多变量时间序列预测(负荷预测)
  5. PyTorch搭建双向LSTM实现时间序列预测(负荷预测)
  6. PyTorch搭建LSTM实现多变量多步长时间序列预测(一):直接多输出
  7. PyTorch搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
  8. PyTorch搭建LSTM实现多变量多步长时间序列预测(三):多模型单步预测
  9. PyTorch搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测
  10. PyTorch搭建LSTM实现多变量多步长时间序列预测(五):seq2seq
  11. PyTorch中实现LSTM多步长时间序列预测的几种方法总结(负荷预测)
  12. PyTorch-LSTM时间序列预测中如何预测真正的未来值
  13. PyTorch搭建LSTM实现多变量输入多变量输出时间序列预测(多任务学习)
  14. PyTorch搭建ANN实现时间序列预测(风速预测)
  15. PyTorch搭建CNN实现时间序列预测(风速预测)
  16. PyTorch搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)
  17. PyTorch搭建Transformer实现多变量多步长时间序列预测(负荷预测)
  18. PyTorch时间序列预测系列文章总结(代码使用方法)
  19. TensorFlow搭建LSTM实现时间序列预测(负荷预测)
  20. TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)
  21. TensorFlow搭建双向LSTM实现时间序列预测(负荷预测)
  22. TensorFlow搭建LSTM实现多变量多步长时间序列预测(一):直接多输出
  23. TensorFlow搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
  24. TensorFlow搭建LSTM实现多变量多步长时间序列预测(三):多模型单步预测
  25. TensorFlow搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测
  26. TensorFlow搭建LSTM实现多变量多步长时间序列预测(五):seq2seq
  27. TensorFlow搭建LSTM实现多变量输入多变量输出时间序列预测(多任务学习)
  28. TensorFlow搭建ANN实现时间序列预测(风速预测)
  29. TensorFlow搭建CNN实现时间序列预测(风速预测)
  30. TensorFlow搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)
  31. PyG搭建图神经网络实现多变量输入多变量输出时间序列预测
  32. PyTorch搭建GNN-LSTM和LSTM-GNN模型实现多变量输入多变量输出时间序列预测
  33. PyG Temporal搭建STGCN实现多变量输入多变量输出时间序列预测
  34. 时序预测中Attention机制是否真的有效?盘点LSTM/RNN中24种Attention机制+效果对比
  35. 详解Transformer在时序预测中的Encoder和Decoder过程:以负荷预测为例
  36. (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  37. PyTorch搭建Informer实现长序列时间序列预测
  38. PyTorch搭建Autoformer实现长序列时间序列预测

上面所有文章一共采用了LSTM、ANN以及CNN三种模型来分别进行时间序列预测。众所周知,CNN提取特征的能力非常强,因此现在不少论文将CNN和LSTM结合起来进行时间序列预测。本文将利用TensorFlow来搭建一个简单的CNN-LSTM混合模型实现负荷预测。

II. CNN-LSTM

CNN-LSTM模型搭建如下:

class CNN_LSTM(tf.keras.Model):
    def __init__(self, args):
        super(CNN_LSTM, self).__init__()
        self.args = args
        # (batch_size=b, seq_len=24, input_size=7)
        # (b, 24, 7)-->(b, 22, 64)
        self.conv1 = Sequential()
        self.conv1.add(layers.Conv1D(64, 2, activation='relu'))
        self.conv1.add(layers.MaxPool1D(pool_size=2, strides=1))
        
        # (b, 22, 64)-->(b, 20, 128)
        self.conv2 = Sequential()
        self.conv2.add(layers.Conv1D(128, 2, activation='relu'))
        self.conv2.add(layers.MaxPool1D(pool_size=2, strides=1))
        # (b, 20, 128)
        self.lstm = layers.LSTM(units=args.hidden_size,
                                activation='tanh', return_sequences=True)
        self.fc = layers.Dense(args.output_size)

    def call(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.lstm(x)
        x = self.fc(x)
        x = x[:, -1, :]

        return x

可以看到,该CNN-LSTM由一层一维卷积+LSTM组成。

通过TensorFlow搭建CNN实现时间序列预测(风速预测)我们知道,
一维卷积的原始定义为:

tf.keras.layers.Conv1D(
    filters, kernel_size, strides=1, padding='valid',
    data_format='channels_last', dilation_rate=1, groups=1,
    activation=None, use_bias=True, kernel_initializer='glorot_uniform',
    bias_initializer='zeros', kernel_regularizer=None,
    bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
    bias_constraint=None, **kwargs
)

这里filters的概念相当于自然语言处理中的embedding,这里输入通道数为15,表示风速+14个环境变量,输出filters设置为64,卷积核大小为2。

原数数据的维度为24,即前24小时的风速+14种气象数据。卷积核大小为2,根据前文公式,原始时序数据经过卷积后维度为:

24 - 2 + 1 = 23

然后经过一个最大池化变成22,然后又是一个卷积层+池化层,变成20。

这里需要注意的是,PyTorch中要求输入数据的shape为(batch_size, input_size, seq_len),而TensorFlow中为(batch_size, seq_len, input_size),也就是说TensorFlow中不需要对原始数据进行维度交换操作。

然后就是比较常规的LSTM输入输出的,不再细说。

III. 代码实现

3.1 数据处理

我们根据前24个时刻的负荷以及该时刻的环境变量来预测接下来12个时刻的负荷,这里采用了直接多输出策略,调整output_size即可调整输出步长。

3.2 模型训练/测试

和前文一致。

3.3 实验结果

简单训练100轮,前24个时刻预测未来12个时刻,MAPE为9.80%:
在这里插入图片描述

IV. 源码及数据

后面将陆续公开~

  • 15
    点赞
  • 194
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
随着深度学习技术的发展,卷积神经网络 (CNN) 和长短时记忆网络 (LSTM) 已成为多变量多步预测领域中最为常用的网络结构之一。 首先, CNN 可以有效的提取时空数据中的特征。通过在卷积层中使用滤波器,我们可以捕捉到不同时间和空间尺度上的信号模式。因此,可以将输入的多个变量作为不同信号的不同通道,通过 CNN 来获取它们之间的相关关系。在使用 CNN 网络的过程中,可以针对不同的问题场景来更改不同的模型结构,例如卷积层数量、卷积核数量和大小等等。 其次, 将 CNN 的特征作为 LSTM 的输入,可以更好地学习序列数据中的依赖关系。 LSTM 模型可以更好地处理序列中的长期依赖关系,避免了过度依赖前面的数据的问题,并且可以自适应地选择需要记忆还是需要遗忘的信息。因此,LSTM能够非常成功地解决多变量多步预测中的长时间序列依赖问题。同时,还可以使用多层 LSTM 结构进行模型的深度学习。 最后,为了得到更好的多步预测结果,还可以使用残差网络 (ResNet) 来解决训练过程中梯度消失和梯度爆炸的问题。ResNet 允许模型立即掌握残差(预测误差)以便在预测过程中更好地考虑残差和历史数据之间的关系。 总的来说,使用 CNN-LSTM 模型可以较好的预测多变量多步的时空序列数据,并且在真实数据集上的性能也得到了很好的验证。当然,在使用该模型时,还需要根据具体应用设置一些超参数,例如滤波器的核大小、时间步长等级。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyril_KI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值