MATLAB中LSTM时序分类的用法与实战

MATLAB中LSTM时序分类的用法与实战

  • 说明

本教程适用于R2018b版本的matlab(不知道R2018a有没有,但是2017版本的肯定是没有LSTM工具箱的了),所以版本低的趁这个机会卸载然后重新下载安装吧(╮(╯▽╰)╭)

引用参考
1.matlab官方文档:https://ww2.mathworks.cn/help/deeplearning/examples/classify-sequence-data-using-lstm-networks.html
2.前人博主的教程:https://blog.csdn.net/weixin_43196262/article/details/83106239

1. LSTM

LSTM(Long Short-Term Memory)是长短期记忆网络,是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。其两大用途为classification和regression,本文介绍如何用LSTM做classification。

2.官方例程解释

2.1 数据集

为了使用LSTM,首先我们必须对其适用数据集有充分的了解。
数据集应为时间序列集,且应划分为训练集XTrain与测试集XTest,训练集XTrain要有对应的分类标签集YTrain作为responses。通过XTrain与YTrain训练数据后,输入XTest,我们可以得到YPred(预测标签集),并与YTest进行对比,便可知道训练结果的优良。

下面以UCI数据集中的 Japanese Vowels数据集作为例子进行解释。该数据集已经整理成.mat格式
(网址链接: https://pan.baidu.com/s/1IySfjLIuee6CrV0HN2K7Lw 提取码:3fev)

在matlab中导入,有一个结构数组,打开后可以看到其中包含了名为train,test的元胞数组,名为trainlables,testlables的数值数组,对应上述的XTrain,XTest与YTrain,YTest。

XTrain是一个1x270 cell数组,即其中包含了270个不同类别的时序集,每一个cell单元是一个12-by-N的矩阵,其中每个cell的N可以不一样(不同cell单元之间的时序长度可以不同)。12代表该时序集的维数。(即XTrian必须为元胞数组

YTrain是一个270x1 double数值数组,对应XTrain中每一个元胞单元的类别,共有9类。(注意此时YTrian还不能用,数值数组必须转为类别数组,后面说明

其物理意义可以解释如下:有9个人说出了270段话,每段话的时间长度不一样,每一个声音样本都提取了一个12维的特征向量。因此,对每一个声音样本来说(也就是每一个cell单元),每一列数据代表某一个时间点上的feature vector,其长度为12。将每一列数据沿行方向排列,构成时间尺度。

在这里插入图片描述
XTest和YTest同理,不再说明。

2.2 用LSTM网络训练与测试

直接上代码

%% 创建变量
XTrain=mts.train;
YTrain=categorical(mts.trainlabels);%将数值数组转化为类别数组
XTest=mts.test;
YTest=categorical(mts.testlabels);

%% 构建LSTM网络
inputSize = 12;%特征的维度
numHiddenUnits = 100;%LSTM网路包含的隐藏单元数目
numClasses = 9;%label标签的种数,该例子中为人数

layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

maxEpochs = 100;%最大训练周期数
miniBatchSize = 27;%分块尺寸

options = trainingOptions('adam', ...
    'ExecutionEnvironment','cpu', ...
    'MaxEpochs',maxEpochs, ...
    'MiniBatchSize',miniBatchSize, ...
    'GradientThreshold',1, ...
    'Verbose',false, ...
    'Plots','training-progress');

%% 训练
net=trainNetwork(XTrain,YTrain,layers, options)

%% 预测
YPred = classify(net,XTest, ...
    'MiniBatchSize',miniBatchSize, ...
    'SequenceLength','longest')
%% 精确度检验
acc = sum(YPred == YTest)./numel(YTest)

训练结果
在这里插入图片描述
检验结果
acc = 0.9324

可见LSTM的分类效果还是挺优良的。
.

3.实战

实战的重点与难点在于如何导入正确的数据
结合本篇与MATLAB中外部数据读取并写入元胞数组的方法与步骤(https://blog.csdn.net/qq_42995378/article/details/87298786) ,鉴于篇幅限制,我将在下一篇文章中给出实战教程与代码。

  • 57
    点赞
  • 442
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
LSTM(长短时记忆网络)是一种递归神经网络,广泛用于时序数据建模和预测。下面是用MATLAB实现LSTM时序预测的简单步骤: 1.准备数据集:将时序数据集分为训练集和测试集。 2.数据预处理:对数据进行归一化处理,可以使用MATLAB的normalize函数。 3.定义LSTM模型:使用MATLABlstmLayer函数定义LSTM层,使用sequenceInputLayer函数定义输入层,使用fullyConnectedLayer函数定义输出层。 4.训练模型:使用MATLAB的trainNetwork函数进行模型训练。 5.模型预测:使用MATLAB的predict函数进行预测。 下面是一个具体的MATLAB代码示例: ``` %加载数据集 load sunspot_dataset %划分训练集和测试集 numTimeStepsTrain = floor(0.9*numel(data)); dataTrain = data(1:numTimeStepsTrain+1); dataTest = data(numTimeStepsTrain+1:end); %对数据进行归一化处理 mu = mean(dataTrain); sig = std(dataTrain); dataTrainStandardized = (dataTrain - mu) / sig; %定义LSTM模型 numFeatures = 1; numResponses = 1; numHiddenUnits = 200; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numResponses) regressionLayer]; %训练模型 options = trainingOptions('adam', ... 'MaxEpochs',100, ... 'GradientThreshold',1, ... 'InitialLearnRate',0.01, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropPeriod',50, ... 'LearnRateDropFactor',0.2, ... 'Verbose',0, ... 'Plots','training-progress'); net = trainNetwork(dataTrainStandardized,layers,options); %对测试集进行预测 dataTestStandardized = (dataTest - mu) / sig; numTimeStepsTest = numel(dataTest); XTest = dataTestStandardized(1:end-1); YTest = dataTest(2:end); YPred = predict(net,XTest); YPred = sig*YPred + mu; %绘制预测结果 figure plot(dataTrain(1:end-1)) hold on idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest-1); plot(idx,[data(numTimeStepsTrain) YPred],'-.') hold off xlabel("Year") ylabel("Mean Sunspot Count") title("Forecast") legend(["Observed" "Forecast"]) ``` 这个示例使用的是太阳黑子数据集,可以根据自己的数据集进行调整。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值