• 时序预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络时间序列预测


    时序预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络时间序列预测

    效果一览

    1
    2
    3
    4
    5
    6
    7
    8

    基本介绍

    MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络时间序列预测。基于贝叶斯(bayes)优化卷积神经网络-长短期记忆网络(CNN-LSTM)时间序列预测,BO-CNN-LSTM/Bayes-CNN-LSTM时间序列预测模型。
    1.优化参数为:学习率,隐含层节点,正则化参数。
    2.评价指标包括:R2、MAE、MSE、RMSE和MAPE等。
    3.运行环境matlab2020b及以上。

    模型搭建

    • CNN-LSTM模型结合了CNN和LSTM的优点,CNN-LSTM网络模型如图1所示,本文使用的CNN-LSTM模型的第一部分是由卷积层和最大值组成的CNN部分池化层,对原始数据进行预处理并输入CNN卷积层,利用卷积核自适应提取生命特征,卷积层将遍历输入信息,将卷积核权重与局部序列进行卷积运算体管信息得到初步的特征矩阵,比原始序列数据(矩阵)更具表现力。
    • 本文使用的池化层是最大池化层,池化操作对提取的特征进行数据降维,避免模型过拟合,保留主要特征。最大池化层将前一个卷积层得到的特征矩阵作为输入,在这个矩阵上滑动一个池化窗口,在每一次滑动中取池化窗口的最大值,输出一个更具表现力的特征矩阵。
    • 池化后,连接一个 LSTM 层,提取相关向量由CNN构造成一个长期的时间序列作为LSTM的输入数据。卷积层将卷积层的数据展平(Flatten),模型中加入Flatten,将(height,width,channel)的数据压缩成一个长高宽通道的一维数组,然后我们可以添加直接密集层。
    • 对卷积池化数据压缩特征操作,多个卷积特征提取框架提取的特征融合或从输出层融合,全连接层聚合学习到的特征,激活函数使用Relu。
    • 通常,在模型训练过程中需要对超参数进行优化,为模型选择一组最优的超参数,以提高预测的性能和有效性。 凭经验设置超参数会使最终确定的模型超参数组合不一定是最优的,这会影响模型网络的拟合程度及其对测试数据的泛化能力。

    8

    • 伪代码
      9

    10

    • 通过调整优化算法调整模型参数,学习重复率和贝叶斯优化超参数来调整模型参数。

    程序设计

    %%  优化算法参数设置
    %参数取值上界(学习率,隐藏层节点,正则化系数)
    %%  贝叶斯优化参数范围
    optimVars = [
        optimizableVariable('NumOfUnits', [10, 50], 'Type', 'integer')
        optimizableVariable('InitialLearnRate', [1e-3, 1], 'Transform', 'log')
        optimizableVariable('L2Regularization', [1e-10, 1e-2], 'Transform', 'log')];
    
    %% 创建混合CNN-LSTM网络架构
    % 输入特征维度
    numFeatures  = f_;
    % 输出特征维度
    numResponses = 1;
    FiltZise = 10;
    %  创建"CNN-LSTM"模型
        layers = [...
            % 输入特征
            sequenceInputLayer([numFeatures 1 1],'Name','input')
            sequenceFoldingLayer('Name','fold')
            % CNN特征提取
            convolution2dLayer([FiltZise 1],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(50,'Name','lstm1','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
            % LSTM输出
            lstmLayer(optVars.NumOfUnits,'OutputMode',"last",'Name','bil4','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
            dropoutLayer(0.25,'Name','drop3')
            % 全连接层
            fullyConnectedLayer(numResponses,'Name','fc')
            regressionLayer('Name','output')    ];
    
        layers = layerGraph(layers);
        layers = connectLayers(layers,'fold/miniBatchSize','unfold/miniBatchSize');
    
    %% CNNLSTM训练选项
    % 批处理样本
    MiniBatchSize =128;
    % 最大迭代次数
    MaxEpochs = 500;
        options = trainingOptions( 'adam', ...
            'MaxEpochs',500, ...
            'GradientThreshold',1, ...
            'InitialLearnRate',optVars.InitialLearnRate, ...
            'LearnRateSchedule','piecewise', ...
            'LearnRateDropPeriod',400, ...
            'LearnRateDropFactor',0.2, ...
            'L2Regularization',optVars.L2Regularization,...
            'Verbose',false, ...
            'Plots','none');
    
    %% 训练混合网络
    net = trainNetwork(XrTrain,YrTrain,layers,options);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    参考资料

    [1] https://blog.csdn.net/kjm13182345320/article/details/129036772?spm=1001.2014.3001.5502
    [2] https://blog.csdn.net/kjm13182345320/article/details/128690229

  • 相关阅读:
    java中的阻塞队列
    Linux 操作系统中如何检查系统的启动和关机日志
    后台项目Gradle打包jar,不包含依赖jar并放到外部路径
    2.数据及其预处理
    Centos7上面安装uWSGI 部署项目测试
    点读笔背后的神秘力量,究竟是如何实现即时识别的?
    Spring加载的过程
    Vue学习之计算属性
    基于单片机的停车场车位管理系统设计
    剑指offer专项突击版第40天
  • 原文地址:https://blog.csdn.net/kjm13182345320/article/details/130445319