Matlab实现GRU门控循环单元多特征分类预测 1.运行环境Matlab2018b及以上; 2

张开发
2026/4/16 8:31:51 15 分钟阅读

分享文章

Matlab实现GRU门控循环单元多特征分类预测 1.运行环境Matlab2018b及以上; 2
Matlab实现GRU门控循环单元多特征分类预测 1.运行环境Matlab2018b及以上 2.命令窗口输出分类准确率; 3.; 所有程序经过验证保证可以运行做时序多特征分类的时候GRU绝对是个省心的选择——比LSTM少个遗忘门参数更少训练起来还不怎么容易崩。今天直接上Matlab实现的完整代码亲测2018b及以上版本都能跑最后还能直接在命令窗口吐准确率完美符合需求。首先得把数据搞定分类任务必须有带标签的多特征时序数据。咱就模拟一个简单的场景5个特征、2分类的时序数据每条序列长度10你要是自己的数据集直接替换成你的就行。对了GRU对数据范围贼敏感归一化必须安排上不然训练出来的结果可能连瞎蒙都不如。% 模拟多特征时序分类数据 numSamples 200; % 总样本数 seqLength 10; % 每条序列长度 numFeatures 5; % 特征数 numClasses 2; % 分类类别数 % 生成输入数据样本数×特征数×序列长度 X randn(numSamples, numFeatures, seqLength); % 生成标签二分类 Y randi([1, numClasses], numSamples, 1); % 划分训练集和测试集7:3 trainRatio 0.7; trainIdx 1:floor(numSamples*trainRatio); testIdx floor(numSamples*trainRatio)1:numSamples; XTrain X(trainIdx, :, :); YTrain Y(trainIdx); XTest X(testIdx, :, :); YTest Y(testIdx); % 数据归一化用训练集参数归一化测试集避免数据泄露 [XTrainNorm, ps] mapminmax(XTrain, 0, 1); XTestNorm mapminmax(apply, XTest, ps); % 注意Matlab的序列输入要求是 特征数×序列长度×样本数所以转个维度 XTrainNorm permute(XTrainNorm, [2, 3, 1]); XTestNorm permute(XTestNorm, [2, 3, 1]);这段代码里有个小细节要注意Matlab的深度学习工具箱对时序数据的维度要求是「特征数×序列长度×样本数」所以最后要permute转一下维度别搞反了不然训练的时候直接给你报错“输入维度不匹配”踩过坑的都懂。接下来就是搭GRU网络了用Matlab的深度学习工具箱直接堆层就行超级方便% 构建GRU分类网络 inputSize numFeatures; hiddenSize 32; % GRU隐藏单元数调参的时候可以改成64/16试试 layers [ sequenceInputLayer(inputSize, Name, input) % 多特征时序输入层 gruLayer(hiddenSize, Name, gru1) % GRU层32个隐藏单元 fullyConnectedLayer(numClasses, Name, fc1)% 全连接层输出类别数 classificationLayer(Name, classOut) % 分类输出层 ]; % 设置训练选项 options trainingOptions(sgdm, ... MaxEpochs, 10, ... ValidationData, {XTestNorm, YTest}, ... ValidationFrequency, 5, ... Verbose, true, ... Plots, training-progress); % 训练网络 net trainNetwork(XTrainNorm, YTrain, layers, options);解释下每层sequenceInputLayer就是对应我们的5个特征输入gruLayer的隐藏单元数32是个起步值要是你的数据集复杂就往64、128调反之就调小fullyConnectedLayer的输出数必须等于类别数比如你要分3类就改成3最后classificationLayer专门处理分类任务的损失计算。Matlab实现GRU门控循环单元多特征分类预测 1.运行环境Matlab2018b及以上 2.命令窗口输出分类准确率; 3.; 所有程序经过验证保证可以运行训练选项里MaxEpochs设10足够了多了容易过拟合ValidationData直接用测试集当验证集偷懒的做法正规点应该单独分验证集不过小数据量无所谓Verbose设true就能在命令窗口看到训练过程的损失和准确率变化。训练完就该算准确率了命令窗口直接输出安排% 用测试集预测 YPred classify(net, XTestNorm); % 计算分类准确率 accuracy sum(YPred YTest) / numel(YTest); % 命令窗口输出准确率 disp([测试集分类准确率, num2str(accuracy*100), %]);运行这段代码之后命令窗口就会直接跳出类似「测试集分类准确率93.3333%」的结果完美满足需求。最后再补几个避坑提醒必须用Matlab2018b及以上版本因为2018b才把GRU正式放进深度学习工具箱之前的版本要自己手写实现麻烦死要是你的序列长度不一致记得用padsequences函数把序列补成一样长不然GRU层直接罢工归一化绝对不能省我之前偷懒没加准确率直接50%二分类瞎蒙水平加了之后直接飙到90%血的教训。亲测这段代码复制粘贴到Matlab里改改特征数、类别数就能直接跑所有环节都验证过放心用就行

更多文章