时序预测 | MATLAB实现CNN-LSTM(卷积长短期记忆神经网络)时间序列预测

时序预测 | MATLAB实CNN-LSTM(卷积长短期记忆神经网络)时间序列预测

基本介绍

本次运行测试环境MATLAB2020b

  • 深度学习方法因其具有较强的数据特征提取和拟合能力,近年来得到迅速发展,常见的深度学习模型有深度信念网络(deep belief networks,DBN)、深度受限玻尔兹曼机(restricted to beboltzmann machines,RBM)、卷积神经网络(convolutional neural networks,CNN)、长短期记忆(long-short-term memory,LSTM)网络等。目前深度学习已在图像处理、语音识别等领域取得了巨大成功。深度学习也在时空关联的数据处理上具有显著优势,尤其用于解决各种预测类问题。
  • 提出一种包含卷积神经网络和长短期记忆网络的CNN- LSTM深度神经网络模型。首先对数据进行处理,然后将处理过的数据和选定的历史数据输入到CNN-LSTM网络中,进行训练,确定模型参数,最后实现对时间序列的预测。

CNN-LSTM模型

CNN网络架构

  • CNN 网络可提取多维时间序列数据在空间结构上的关系,它主要由卷积层和池化层组成,利用局部连接、权值共享等特征大幅降低模型参数的数量、提取数据特征、加快训练速度、提高泛化性能。
  • 典型的卷积神经网络结构如图所示。其中卷积层由多个特征面组成,每个特征面由多个神经元组成,其中每个神经元通过卷积核与上一层局部的特征面区域相互连接,卷积神经网络的卷积层就是通过这样的卷积操作提取不同时间序列数据的不同特征。
  • 池化层在卷积层之后,也是由多个特征面组成,每个特征面对应其上一层的一个特征面,因而不会改变特征面的数量。池化层的作用是数据特征的二次提取,对数据进行降维,常用的池化方法有最大池化法、均值池化法等。
  • 卷积神经网络分为一维卷积、二维卷积和三维卷积,每一类都有各自的适用场景。
  • 其中一维卷积神经网络主要应用在时间序列数据上,假设其第l层是卷积层,则一维卷积的计算为:
    1
  • 对于池化层,本文采用最大池化法
    2

LSTM网络架构

  • LSTM 网络是循环神经网络(recurrent neural network,RNN)的一种,相对于传统的神经网络,RNN 网络能更好地处理时间序列问题。典型的RNN 结构如图所示。RNN 网络的传递为:3
    4
  • 传统RNN 隐含层的内部结构简单,网络对当前时刻的输入和上一时刻的输入状态未进行筛选,可能使长时间序列的关键数据信息无法传递下去,从而对预测结果造成较大偏差。LSTM 网络在隐含层内部加入输入门、输出门、遗忘门,并增加了用于存储记忆的单元,典型的LSTM 网络隐含层的内部结构如图所示。各变量之间的函数关系为:
    5
    6
    7
  • 由此可知,当输入量输入到LSTM网络隐含层后,先经过输入门经非线性变换后,与遗忘门处理过的记忆单元状态叠加,形成新的记忆单元状态,最后记忆单元状态经非线性函数处理后与经非线性函数处理的当前信息状态相点乘就可得到隐含层的输出。
  • 类似于LSTM 网络的结构,深度门控循环单元(gated recurrent unit,GRU)相比于LSTM网络内部结构减少了一个门单元和隐藏状态,取而代之的是重置门和更新门,内部结构更为简单,但对于大量数据的处理效果不如LSTM网络。

CNN-LSTM网络

  • 本文采用历史数据作为预测模型的输入,预测值作为输出。
  • 因此将1维的向量输入到CNN-LSTM 网络中。类似构造的网络结构,经测试,本文构造的CNN-LSTM网络模型参数为:
    1)一维卷积神经网络:CNN 网络包括卷积层和池化层,各层有卷积核和池化核,大小设定维度向量;激活函数都为ReLu或eLu。
    2)长短期记忆神经网络:LSTM 网络包括层单元,每一层的隐含神经元数目相应设定;激活函数可以选择ReLu或eLu。
    3)全连接层:采用单隐含层的深度神经网络作为CNNLSTM网络模型的输出层对数据进行拟合预测,输出结果为t时刻的预测值。
  • 整个CNN- LSTM 网络风功率训练预测模型如图所示。从图4可看出,CNN-LSTM 网络模型主要由两部分组成:首先输入数据经过CNN 网络,通过卷积和池化操作,实现对数据特征的提取和降维;经CNN 网络处理过的数据输入到LSTM 网络,LSTM 网络中的遗忘门、输入门和输出门通过大量数据的不断迭代训练调整自身参数,使它能从CNN 网络提取的数据信息中学习数据间的时间拟合关系,从而对预测时间序列输入输出数据进行有效的动态建模,最后通过CNN-LSTM 网络拟合训练好的数据通过全连接神经元网络输出预测值 。整个预测过程需先通过数据进行训练,确定网络模型参数。
    8
  • 对于整个CNN-LSTM 网络风功率预测模型的训练,本文采用按时间展开的反向误差传播算法(BPTT),即对神经网络按时间顺序展开为一个深层网络,然后使用误差反向传播(back propagation,BP)算法对展开后的网络进行训练。传统的梯度优化算法如随机梯度下降法(stochastic gradient descent,SGD),该算法简单、易于实现,但存在梯度消失、收敛速度较慢、难于收敛到全局最小值等缺点。针对SGD 算法的缺点,目前已提出很多改进的优化算法,如动量算法、AdaGrad、Adam 等。本文使用Adam的算法。
  • 经本文模拟试验发现,只是增加CNN-LSTM 网络模型中CNN 和LSTM网络层数量并不能有效提高预测的精度。随着神经网络层数量的增加,内部参数急剧增加,而预测的输入数据结构较为单一。
  • 因此经过大量数据的训练后,网络模型倾向于模拟训练数据的特征而缺乏预测,从而出现过拟合现象。
  • 本文使用Dropout 技术来减少模型的过拟合现象。在训练过程中,Dropout 技术将隐藏节点中的每个与其相连的输入权值以1-p的概率清零,使得这部分输入与神经元之间相连的权值在训练过程中不参与正向与反向传播,使得网络模型具有较好的防过拟合特性。

程序设计

%% CNN-LSTM时间序列预测
%% 输入参数
clc;
clear;
clearvars
% 时间滞后阶数;
Lag = 1:8;
% 训练集比例
ratio = 0.9;
% 批处理样本
MiniBatchSize =24;
% 最大迭代次数
MaxEpochs = 60;
% 学习率
learningrate = 0.005;
%% 加载数据
load data;
data = [data{
    
    :}];
%% 在训练和测试中划分顺序
% 在训练和测试中拆分数据。 
% 90%的数据用于训练,而10%的数据用于测试。 
numStepsTraining = round(ratio*numel(data));
indexTrain = 1:numStepsTraining;
dataTrain = data(indexTrain );
indexTest = numStepsTraining+1:size(data,2);
dataTest  = data(indexTest);
  • CNN-LSTM网络架构
%  创建"CNN-LSTM"模型
    layers = [...
        % 输入特征
        sequenceInputLayer([numFeatures 1 1],'Name','input')
        sequenceFoldingLayer('Name','fold')
        % CNN特征提取
        convolution2dLayer(FiltZise,32,'Padding','same','WeightsInitializer','he','Name','conv','DilationFactor',1);
        batchNormalizationLayer('Name','bn')
        eluLayer('Name','elu')
        averagePooling2dLayer(1,'Stride',FiltZise,'Name','pool1')
        % 展开层
        sequenceUnfoldingLayer('Name','unfold')
        % 平滑层
        flattenLayer('Name','flatten')
        % LSTM特征学习
        lstmLayer(128,'Name','lstm1','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
        dropoutLayer(0.25,'Name','drop1')
        % LSTM输出
        lstmLayer(32,'OutputMode',"last",'Name','bil4','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
        dropoutLayer(0.25,'Name','drop2')
        % 全连接层
        fullyConnectedLayer(numResponses,'Name','fc')
        regressionLayer('Name','output')    ];

    layers = layerGraph(layers);
    layers = connectLayers(layers,'fold/miniBatchSize','unfold/miniBatchSize');

预测结果

9
10
11

12

参考资料

[1] https://www.bilibili.com/video/BV1pq4y1f7kZ?spm_id_from=333.999.0.0
[2] https://mianbaoduo.com/o/bread/mbd-YZ2Zm5xs
[3] https://blog.csdn.net/kjm13182345320/article/details/118858103

致谢

  • 大家的支持是我写作的动力!
  • 感谢大家订阅,感谢,记得备注!

猜你喜欢

转载自blog.csdn.net/kjm13182345320/article/details/120377303