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

 更新时间:2021年05月17日 09:29:45   作者:CodeInHand  
本文主要基于Pytorch深度学习框架,实现LSTM神经网络模型,用于时间序列的预测
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

开发环境说明:

Python 35

Pytorch 0.2

CPU/GPU均可

1、LSTM简介

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

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

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

具体下所示:

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

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

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

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

如下所示:

遗忘门: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的数据。

3、模型构建

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

4、训练和测试

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

(2)训练与测试

(3)结果展示

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

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

相关文章

  • 跟老齐学Python之dict()的操作方法

    跟老齐学Python之dict()的操作方法

    这篇文章主要介绍了dict()的操作方法,由于dict的很多方法跟list类似,所以在详细介绍dict的同时,也跟list做了对比,是篇非常不错的文章,有需要的朋友参考下
    2014-09-09
  • python钉钉机器人运维脚本监控实例

    python钉钉机器人运维脚本监控实例

    今天小编就为大家分享一篇python钉钉机器人运维脚本监控实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • python求crc32值的方法

    python求crc32值的方法

    这篇文章主要介绍了python求crc32值的方法,包括相关的步骤及实现方法,需要的朋友可以参考下
    2014-10-10
  • python下载库的步骤方法

    python下载库的步骤方法

    在本篇文章里小编给大家分享的是关于python怎么下载库的详细实例内容,有需要的朋友们学习下。
    2019-10-10
  • numpy实现神经网络反向传播算法的步骤

    numpy实现神经网络反向传播算法的步骤

    这篇文章主要介绍了numpy实现神经网络反向传播算法的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Python 中Pickle库的使用详解

    Python 中Pickle库的使用详解

    pickle是python语言的一个标准模块,安装python后已包含pickle库,不需要单独再安装。这篇文章主要介绍了Python 中Pickle库的使用详解,需要的朋友可以参考下
    2018-02-02
  • Python数据结构之树的全面解读

    Python数据结构之树的全面解读

    数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。本文中对数据结构中常见的树逻辑结构和存储结构进行了汇总,不求严格精准,但求简单易懂
    2021-11-11
  • 分析并输出Python代码依赖的库的实现代码

    分析并输出Python代码依赖的库的实现代码

    这篇文章主要介绍了分析并输出Python代码依赖的库的实现代码,需要的朋友可以参考下
    2015-08-08
  • numpy.ndarray.flatten()函数的具体使用

    numpy.ndarray.flatten()函数的具体使用

    本文主要介绍了numpy.ndarray.flatten()函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Python线程协作threading.Condition实现过程解析

    Python线程协作threading.Condition实现过程解析

    这篇文章主要介绍了Python线程协作threading.Condition实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论

?


http://www.vxiaotou.com