Pytorch 如何实现LSTM时间序列预测


Posted in Python onMay 17, 2021

开发环境说明:

Python 35

Pytorch 0.2

CPU/GPU均可

1、LSTM简介

人类在进行学习时,往往不总是零开始,学习物理你会有数学基础、学习英语你会有中文基础等等。

于是对于机器而言,神经网络的学习亦可不再从零开始,于是出现了Transfer Learning,就是把一个领域已训练好的网络用于初始化另一个领域的任务,例如会下棋的神经网络可以用于打德州扑克。

我们这讲的是另一种不从零开始学习的神经网络——循环神经网络(Recurrent Neural Network, RNN),它的每一次迭代都是基于上一次的学习结果,不断循环以得到对于整体序列的学习,区别于传统的MLP神经网络,这种神经网络模型存在环型结构,

具体下所示:

Pytorch 如何实现LSTM时间序列预测

上图是RNN的基本单元,通过不断循环迭代展开模型如下所示,图中ht是神经网络的在t时刻的输出,xt是t时刻的输入数据。

这种循环结构对时间序列数据能够很好地建模,例如语音识别、语言建模、机器翻译等领域。

Pytorch 如何实现LSTM时间序列预测

但是普通的RNN对于长期依赖问题效果比较差,当序列本身比较长时,由于神经网络模型的训练是采用backward进行,在梯度链式法则中容易出现梯度消失和梯度爆炸的问题,需要进一步改进RNN的模型结构。

针对Simple RNN存在的问题,LSTM网络模型被提出,LSTM的核心是修改了增添了Cell State,即加入了LSTM CELL,通过输入门、输出门、遗忘门把上一时刻的hidden state和cell state传给下一个状态。

如下所示:

Pytorch 如何实现LSTM时间序列预测

遗忘门:ft = sigma(Wf*[ht-1, xt] + bf)

输入门:it = sigma(Wi*[ht-1, xt] + bi)

cell state initial: C't = tanh(Wc*[ht-1, xt] +bc)

cell state: Ct = ft*Ct-1+ itC't

输出门:ot = sigma(Wo*[ht-1, xt] + bo)

模型输出:ht = ot*tanh(Ct)

LSTM有很多种变型结构,实际工程化过程中用的比较多的是peephole,就是计算每个门的时候增添了cell state的信息,有兴趣的童鞋可以专研专研。

上一部分简单地介绍了LSTM的模型结构,下边将具体介绍使用LSTM模型进行时间序列预测的具体过程。

2、数据准备

对于时间序列,本文选取正弦波序列,事先产生一定数量的序列数据,然后截取前部分作为训练数据训练LSTM模型,后部分作为真实值与模型预测结果进行比较。正弦波的产生过程如下:

SeriesGen(N)方法用于产生长度为N的正弦波数值序列;

trainDataGen(seq,k)用于产生训练或测试数据,返回数据结构为输入输出数据。seq为序列数据,k为LSTM模型循环的长度,使用1~k的数据预测2~k+1的数据。

Pytorch 如何实现LSTM时间序列预测

3、模型构建

Pytorch的nn模块提供了LSTM方法,具体接口使用说明可以参见Pytorch的接口使用说明书。此处调用nn.LSTM构建LSTM神经网络,模型另增加了线性变化的全连接层Linear(),但并未加入激活函数。由于是单个数值的预测,这里input_size和output_size都为1.

Pytorch 如何实现LSTM时间序列预测

4、训练和测试

(1)模型定义、损失函数定义

Pytorch 如何实现LSTM时间序列预测

(2)训练与测试

Pytorch 如何实现LSTM时间序列预测

(3)结果展示

比较模型预测序列结果与真实值之间的差距

Pytorch 如何实现LSTM时间序列预测

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
关于Python数据结构中字典的心得
Dec 04 Python
python中的字典操作及字典函数
Jan 03 Python
批量将ppt转换为pdf的Python代码 只要27行!
Feb 26 Python
python中字符串比较使用is、==和cmp()总结
Mar 18 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
python打包成so文件过程解析
Sep 28 Python
Python模块相关知识点小结
Mar 09 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
Python如何批量生成和调用变量
Nov 21 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 Python
pytorch实现ResNet结构的实例代码
pytorch常用数据类型所占字节数对照表一览
May 17 #Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
Pytorch 实现变量类型转换
Python进度条的使用
May 17 #Python
Python包管理工具pip的15 个使用小技巧
You might like
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
小程序实现多选框功能
2018/10/30 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python中列表元素转为数字的方法分析
2016/06/14 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
python分布式计算dispy的使用详解
2019/12/22 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
保荐人的岗位职责
2013/11/19 职场文书
美容师的职业规划书
2013/12/27 职场文书
小学班主任评语大全
2014/04/23 职场文书
商务经理岗位职责
2014/08/03 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
信息合作协议书
2014/10/09 职场文书
会计电算化实训报告
2014/11/04 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
委托书范本格式
2019/04/18 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL