Matlab实现CNN-LSTM多输入多输出预测:‘MainCNNLSTMNM.m‘程序及数据...
Matlab实现CNN-LSTM卷积长短期记忆神经网络多输入多输出预测 所有程序经过验证保证有效运行。 可有偿替换数据及其他服务。 1.data为数据集10个输入特征3个输出变量。 2.MainCNNLSTMNM.m为主程序文件。 3.命令窗口输出MAE和R2 4.运行版本2020b及以上这个CNN-LSTM混合模型有点东西啊最近在Matlab2020b环境实测了一波多输入多输出预测效果还真不赖。咱们直接上干货手把手教你从数据预处理到模型部署的全流程。先看数据部分data.mat10个特征输入3个输出这种配置在工业预测中挺常见的。老规矩先把数据切成训练集和测试集% 数据切片时间步长记得自己调 train_ratio 0.8; seq_len 12; % 根据数据周期调整 [input_train, output_train] create_dataset(data_input, data_output, 1:floor(size(data_input,1)*train_ratio), seq_len); [input_test, output_test] create_dataset(data_input, data_output, floor(size(data_input,1)*train_ratio)1:end, seq_len);这里createdataset函数是自定义的时间窗口生成器相当于把时间序列数据改造成CNN能吃的3D格式样本数×时间步×特征数。注意seqlen别设太大不然内存要爆炸。Matlab实现CNN-LSTM卷积长短期记忆神经网络多输入多输出预测 所有程序经过验证保证有效运行。 可有偿替换数据及其他服务。 1.data为数据集10个输入特征3个输出变量。 2.MainCNNLSTMNM.m为主程序文件。 3.命令窗口输出MAE和R2 4.运行版本2020b及以上网络结构是重头戏CNN和LSTM的混搭要注意层连接顺序。咱们先上卷积层提取空间特征再接LSTM捕捉时间依赖layers [ sequenceInputLayer(inputSize) % inputSize根据数据自动获取 convolution1dLayer(3, 64, Padding, same) % 一维卷积核 batchNormalizationLayer reluLayer maxPooling1dLayer(2,Stride,1) lstmLayer(128, OutputMode, sequence) dropoutLayer(0.3) fullyConnectedLayer(outputSize) % outputSize3 regressionLayer];这里有几个细节要划重点卷积核选3是经验值小尺寸更适合捕捉局部特征BatchNorm层加速收敛还防过拟合LSTM后面接Dropout比在卷积后加效果更好最后一层全连接直接输出3个预测值训练参数设置直接影响收敛速度options trainingOptions(adam, ... MaxEpochs, 100, ... MiniBatchSize, 32, ... InitialLearnRate, 0.001, ... LearnRateSchedule, piecewise, ... Shuffle, every-epoch, ... Plots, training-progress);实测发现初始学习率设0.001配合分段衰减最稳定batch size根据显存来调32是个安全值。如果训练曲线波动太大可以试试梯度裁剪。跑完训练直接看结果% 预测并计算指标 pred_train predict(net, input_train); pred_test predict(net, input_test); fprintf(训练集MAE: %.4f R2: %.4f\n, mae(output_train, pred_train), r2_score(output_train, pred_train)); fprintf(测试集MAE: %.4f R2: %.4f\n, mae(output_test, pred_test), r2_score(output_test, pred_test));这里r2_score需要自己实现用1 - (SSres/SStot)公式就能搞定。注意输出是三维数据计算前记得squeeze降维。最后给几个调参小贴士当验证损失震荡时试试减小学习率或增大batch size输入序列长度不是越长越好先用自相关函数找数据周期输出维度多的时候可以给不同输出加权重损失函数遇到显存不足降低序列长度或使用更小的卷积核这套框架实测在负荷预测、股价预测等场景表现都不错。想要换自己的数据直接把data.mat里的数据替换成同格式的记得输入特征数要对应修改inputSize参数。如果遇到维度不匹配的报错八成是数据reshape没做好重点检查create_dataset函数里的维度转换部分。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2409951.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!