Matlab使用LSTM网络做classification和regression时XTrain的若干种数据结构-part II

接上篇,这篇记录使用LSTM进行sequence-to-sequence classification。

2. squence-to-sequence classification (以下简称STS)

完整参考来自mathworks官网:
https://www.mathworks.com/help/deeplearning/examples/sequence-to-sequence-classification-using-deep-learning.html?searchHighlight=sequenceInputLayer&s_tid=doc_srchtitle
该示例使用从佩戴在身体上的智能手机获得的传感器数据。 该示例训练LSTM网络以识别佩戴者的活动,给出表示三个不同方向上的加速度计读数的时间序列数据。 训练数据包含七个人的时间序列数据(也就是7个sequences)。 每个序列具有三个特征并且长度不同。 将这7个sequences中的六个用来train,一个用来test。

2.1 load data

load HumanActivityTrain

执行上述语句后,XTrain和YTrain被加载到workspace中,数据结构描述如下:
(1)XTrain是一个1-by-6的cell array, YTrain是一个1-by-6的category cell。
(2)一个cell是一个sequence,物理意义可以理解为一个人的data。
(3)XTrain的每一个cell是一个3-by-N的矩阵,3是特征个数(也就是说feature dimension 是3),N是时间,每个cell中的N可以不一致,物理意义可以理解为每个人记录的时间长度不一样。XTrain的结构如下:

3×64480 double 3×53696 double 3×56416 double 3×50688 double 3×51888 double 3×54256 double

(4)YTrain的每一个cell是一个1-by-N的vector。YTrain的结构如下

1×64480 categorical 1×53696 categorical 1×56416 categorical 1×50688 categorical 1×51888 categorical 1×54256 categorical

总结:从PartI以及这个例子可以总结出,一个XTrain的sequence可以是vector也可以是matrix。沿行方向的通常是时间,沿列方向的是特征个数。如果每个sequence只有一个feature,那么每个sequence的结构是1-by-N的vector,N代表时间长度;如果每个sequence有M个特征,那么每个sequence的结构是M-by-N matrix。每个sequence的N可以不一样,但M必须是一致的。比如PartI中,每个sequence的feature dimension是12,则M=12。这个例子中,每个sequence的feature dimension是3,则M=3
(5)YTrain中,人体的活动有五种,分别是’dancing’,‘running’,‘sitting’,‘standing’,‘walking’。可以使用 classes = categories(YTrain{1})语句来查看。
(6)XTrain和YTrain的input-output对应关系如下图

下面查看第一个人(等价于first sequence,等价于XTrain{1})第一个特征数据(等价于first feature,等价于第一个传感器数据,等价于XTrain{1}(1,:))的plot图形,代码如下:

X = XTrain{1}(1,:);
classes = categories(YTrain{1});

figure
for j = 1:numel(classes)
    label = classes(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(classes,'Location','northwest')

在这里插入图片描述

2.2 设计LSTM网络架构

LSTM的架构和Part I中 sequence-to-label classification的结构是一致的,只是lstmLayer函数中’outputMode’设为’sequence’, 代码如下:

featureDimension = 3;
numHiddenUnits = 100;
numClasses = 5;

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

2.3 设置training options

(1)求解器设为’adam’
(2)初始学习率initial learn rate设为0.01
(3)为防止渐变溢出,设置渐变阈值为1

options = trainingOptions('adam', ...
    'GradientThreshold',1, ...
    'InitialLearnRate',0.01, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropPeriod',20, ...
    'Verbose',0, ...
    'Plots','training-progress');

2.4 训练网络

net = trainNetwork(XTrain,YTrain,layers,options);

2.5 测试网络

测试集只有一对输入输出,物理意义可以理解为只测试一个人的数据,XTest是一个feature dimension为3的sequence。以下代码将该sequence的3个feature都打印了出来。

load HumanActivityTest
figure
plot(XTest')
xlabel("Time Step")
legend("Feature " + (1:featureDimension))
title("Test Data")

在这里插入图片描述
使用classfy对测试集数据进行分类

YPred = classify(net,XTest);

此外,可以使用classifyAndUpdateState进行一次一步的执行分类,这当数据随时间流依次到达时非常有用。
检测分类精度

acc = sum(YPred == YTest)./numel(YTest)

将网络输出结果和目标输出结果进行对比

figure
plot(YPred,'.-')
hold on
plot(YTest)
hold off

xlabel("Time Step")
ylabel("Activity")
title("Predicted Activities")
legend(["Predicted" "Test Data"])
发布了21 篇原创文章 · 获赞 10 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43196262/article/details/83109888
ii