之前主要研究现代信号处理,深度学习嘛,一个大号/深层的,现代的,黑箱的,信号/图像处理器,所以,作为一个研究现代信号处理的,顺便搞些深度学习也是顺理成章的。
本文简单讲解一下如何使用长短时记忆(LSTM)网络对序列数据进行分类。
为了训练深层神经网络对序列数据的每个时间步长进行分类,使用Sequence-to-Sequence的LSTM网络。Sequence-to-Sequence的LSTM网络能够对序列数据的每个单独的时间步长进行不同的预测
本文使用从受试者智能手机中获得的传感器数据,以识别受试者的动作,包括跳舞、跑步、散步、站立和静坐。训练数据包含七个受试者的时间序列数据,每个时间序列有三个特征(三个特征对应于三个不同方向的加速度计读数),长度各不相同。数据集包含六个训练观测值和一个测试观测值。
加载序列数据
XTrain
XTrain = 1×6 cell array
{3×64480 double} {3×53696 double} {3×56416 double} {3×50688 double} {3×51888 double} {3×54256 double}
可视化其中一个训练序列,绘制第一个训练序列的第一个特征,并根据相应的活动对图进行着色。
X = XTrain{1}(1,:);
classNames = categories(YTrain{1});
figure
for j = 1:numel(classNames)
label = classNames(j);
idx = find(YTrain{1} == label);
hold on
plot(idx,X(idx))
end
hold off
xlabel("Time Step")
ylabel("Acceleration")
title("Training Sequence 1, Feature 1")
legend(classNames,'Location','northwest')
定义LSTM网络结构
定义 LSTM 网络结构。输入维度为 3(输入数据的特征维度),隐层单元维度为100,然后通过维度为 5 的全连接层,最后为softmax 层和分类层以识别5个人体动作。
featureDimension = 3;
numHiddenUnits = 100;
numClasses = 5;
layers = [ ...
sequenceInputLayer(featureDimension)
lstmLayer(numHiddenUnits,'OutputMode','sequence')
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer];
设置训练参数。使用adam优化器,初始学习速率为0.01,为了防止梯度爆炸,将梯度阈值设置为 1。
options = trainingOptions('adam', ...
'GradientThreshold',1, ...
'InitialLearnRate',0.01, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',20, ...
'Verbose',0, ...
'Plots','training-progress');
开始对网络进行训练
net = trainNetwork(XTrain,YTrain,layers,options);
测试LSTM网络
加载测试数据并在每个时间步长对受试者活动进行分类。
加载测试数据XTest ,YTest 是与每个时间步长的活动相对应的一系列活动类别标签。
figure
plot(XTest')
xlabel("Time Step")
legend("Feature " + (1:featureDimension))
title("Test Data")
使用classify函数对测试数据进行分类,并计算准确率
YPred = classify(net,XTest);
acc = sum(YPred == YTest)./numel(YTest)
acc=0.9866
将预测结果与测试数据进行比较
figure
plot(YPred,'.-')
hold on
plot(YTest)
hold off
xlabel("Time Step")
ylabel("Activity")
title("Predicted Activities")
legend(["Predicted" "Test Data"])
完整代码
https://mianbaoduo.com/o/bread/Y5malJlq