PyTorch中实现LSTM多步长时间序列预测的几种方法总结(负荷预测)_pytorch实现lstm时间序列预测-程序员宅基地

技术标签: lstm  时间序列预测  多步长预测  DL  pytorch  负荷预测  

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实现长序列时间序列预测

PyTorch搭建LSTM实现多变量多步长时间序列预测(负荷预测)中我简单实现了一下LSTM的多变量多步预测,其中LSTM搭建如下:

class LSTM(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size, batch_size):
        super().__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.output_size = output_size
        self.num_directions = 1 # 单向LSTM
        self.batch_size = batch_size
        self.lstm = nn.LSTM(self.input_size, self.hidden_size, self.num_layers, batch_first=True)
        self.linear = nn.Linear(self.hidden_size, self.output_size)

    def forward(self, input_seq):
        batch_size, seq_len = input_seq.shape[0], input_seq.shape[1]
        h_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
        c_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
        output, _ = self.lstm(input_seq, (h_0, c_0))
        pred = self.linear(output)
        pred = pred[:, -1, :]
        return pred

可以看到,在得到output之后我直接将其经过一个线性层,将单个输出转成了多个输出,这种方法的优点是比较简单,但可能没有考虑到时间序列之间的相关性,而是直接将其变成了一个非线性转换问题。下面我总结一下常见的五种多步预测方法。

II. 多步预测

2.1 直接多输出

这种方法也就是我之前那篇文章所使用的方法,输入经过LSTM之后,得到的输出是:

output(batch_size, seq_len, num_directions * hidden_size)

此时再经过一个线性层:

Linear(num_directions * hidden_size, output_size)

就变成了:

(batch_size, seq_len, output_size)

然后根据时间序列预测下一个的原理,我们直接取最后一个seq即可:

pred = pred[:, -1, :]

2.2 单步滚动预测

我们遵循LSTM的原理,每次只预测单个,比如前10个预测后3个:我们首先利用[1…10]预测[11’],然后利用[2…10 11’]预测[12’],最后再利用[3…10 11’ 12’]预测[13’],也就是为了得到多个预测输出,我们直接预测多次。这种方法的缺点是显而易见的:由于每一步的预测都有误差,将有误差的预测值带入进行预测后往往会造成更大的误差,让误差传递。利用这种方式预测到后面通常预测值就完全不变了。

2.3 多模型单步预测

比如前10个预测后3个,那么我们可以训练三个模型分别根据[1…10]预测[11]、[12]以及[13]。也就是说如果需要进行n步预测,那么我们一共需要训练n个LSTM模型,缺点很突出。

2.4 多模型滚动预测

这种方式是2.2和2.3的结合,还是以前10个预测后3个为例:按照2.3中描述训练三个模型,首先模型1利用[1…10]预测[11’],然后模型2利用[2…10 11’]预测[12’],最后由模型3利用[3…10 11’ 12’]预测[13’]。

2.5 seq2seq预测

和直接多输出有点类似,但采用编码器-解码器结构来进行训练。

III. 源码及数据

后面将陆续公开~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Cyril_KI/article/details/124943601

智能推荐

vue3—html元素变成图片canvas(海报生成),进行图片保存,复制就能用_vue3 canvas生成海报图片-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏7次。// 网页上只有一张图片 我们可以直接就进行图片保存// 但是你想 保存这张图片的时候 顺便把下面的字也带上 相当于截图 那请你像我这样做 <div id="capture" style="padding: 10px; background: #fff"> <img :src="whoImg" style="width: 300px" alt="" /> <h4 style="color: #000">Hello world!</h4_vue3 canvas生成海报图片

python 全栈开发,Day57(响应式页面-@media介绍,jQuery补充,移动端单位介绍,Bootstrap学习)...-程序员宅基地

文章浏览阅读288次。python 全栈开发,Day57(响应式页面-@media介绍,jQuery补充,移动端单位介绍,Bootstrap学习) 昨日内容回顾               ajax //get post 两种方式 做 请求get 主要是获取数据post 提交数据同一个路由地址 ..._python开发响应式官网

[Mark]The problems & solutions of vmware vsphere-程序员宅基地

文章浏览阅读494次。[Mark]The problems & solutions of vmware vsphere Vmware vSphere常见问题汇总(转)发表于2014 年 10 月 28 日由yukui 1、启用客户机操作系统和远程控制台之间的复制和粘贴操作..._filesystem.copydirectory();在某些文件和目录下未能完成操作。有关详细信息,请参

Qt 程序发布以及打包成exe安装包_qt发布程序打包成安装程序-程序员宅基地

文章浏览阅读3.1k次。文章目录一、windeployqt.exe发布程序二、解决第三方依赖问题三、使用Inno打包成exe一、windeployqt.exe发布程序使用程序构建时相对应的命令工具进行发布我的程序使用MSVC进行构建Release的,故使用MSVC的命令行进行发布:步骤(截图):使用release生成exe程序(如:F:\QT\build-Yolov5Detect-Desktop_Qt_5_14_2_MSVC2017_64bit-Release\release)复制上述文件夹下exe文件到到新建文件_qt发布程序打包成安装程序

Android中播放音乐的几种方式_安卓开发播放音乐-程序员宅基地

文章浏览阅读6w次,点赞38次,收藏175次。Android中播放音乐的几种方式前言 前几天一直在研究RxJava2,也写了记录了几篇博客,但因为工作任务原因,需要研究音频相关的知识,暂时放下Rxjava,本文的demo中,MediaPalyer 部分使用RxJava编写一点逻辑,其中涉及,RxJava2的被压、解除订阅等知识点,虽然简单,最起码没有丢了RxJava,后续Rxjava会继续研究,做记录. andorid提供了对声音_安卓开发播放音乐

FlinkSQL CDC实现同步oracle数据到mysql_flink cdc同步oracle-程序员宅基地

文章浏览阅读1.5k次。环境准备。_flink cdc同步oracle

随便推点

Python安装、配置图文详解_python this usually means that your interpreter is-程序员宅基地

文章浏览阅读1.4k次。目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(IDE) 1. 在Eclipse中安装PyDev插件 2. 配置Python Interpreters _python this usually means that your interpreter is not in the system path.

Socket实现一个简单的半双工通信_如何实现刷全双工和半双工 socket-程序员宅基地

文章浏览阅读4.4k次。Socket是客户端进行在网络与服务器进行数据交互的一种基本通信方式,通信有三种通信,即单工,半双工,和全双工。 所谓单工,就是只能够进行单向通信,如bb机。 而半双工就是一来一回的通信方式,如对讲机。 全双工也是最常用的,就是现实长连接实时通信,如QQ。 如果理解了上面的三个工作方式,那下面就以半双工为例,分析一下其工作的流程: 首先:在服务器端建立一个监听端口,没有多么复杂,就相当于一_如何实现刷全双工和半双工 socket

用c/c++语言程序实现Linux系统下的cp复制文件命令-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏9次。用c/c++语言程序实现Linux系统下的cp部分命令#include<stdio.h>#include<stdlib.h>#include<string.h>#include<dirent.h>#include<sys/stat.h>#include<unistd.h> //复制文件int copy_fil..._用c/c++语言程序实现linux系统下的cp复制文件命令

使用树莓派基于FFmpeg推流视频和摄像头到B站直播间_树莓派在b站上推流-程序员宅基地

文章浏览阅读4.9k次,点赞2次,收藏25次。文章目录从B站直播间获取rtmp地址和直播码使用ffpmeg进行视频或摄像头推流前提条件1、首先要有一个树莓派,并连接了摄像头,且能够访问网络。2、在Bilibili中通过实名认证,并开通了直播间。(很简单的,实名认证通过后直接就可以开通了)。3、FFmpeg。推流默认使用FFmpeg,树莓派官方系统默认安装FFmpeg了的,可以使用ffpmeg -version查看详细信息。从B站直播间获取rtmp地址和直播码申请了B站直播间后,用电脑开启直播,一定要用电脑才能获取rtmp地址和直播码,用手机_树莓派在b站上推流

Echarts 开发图表 两种方式实现异步数据加载_echarts异步数据-程序员宅基地

文章浏览阅读3.4k次,点赞5次,收藏18次。文章目录一、异步加载数据 方法一二、异步加载数据 方法二 - 推荐好文章 记得收藏+点赞+关注额 !!!---- Nick.Peng一、异步加载数据 方法一ECharts 中实现异步数据的更新非常简单,在图表初始化后不管任何时候只要通过 jQuery 等工具异步获取数据后通过 setOption 填入数据和配置项就行;代码 6 步实现及解析如下:<!DOCTYPE htm..._echarts异步数据

Mybatis的坑——SqlSessionFactory,Mapper接口和mapper.xml映射文件_sqlsessionfactory 指定mapper xml目录及子目录-程序员宅基地

文章浏览阅读2.6k次。在平时的开发中,连接数据库进行增删改查的方案有很多,常见的直接有:jdbc,但是如果直接使用jdbc,会存在很多问题。首先,频繁的创建连接和释放会造成资源的浪费从而影响性能,这个问题可以用数据库连接池来解决。而且,还有一种情况比较坑,就是在开发中,有时新手在开发中会忘记close掉connection,造成连接数不够,无法访问数据库。一般企业开发中,如果使用jdbc,也不会直接手写,而是开发一个访问数据库连接的对象,比如DBACCESS之类的,在这个类里面进行连接进行创建和关闭,这样就不会踩到这个坑了_sqlsessionfactory 指定mapper xml目录及子目录

推荐文章

热门文章

相关标签