赞
踩
前期在学习特征分类的时候确实花了不少功夫,想去了解一下长短时记忆网络的分类效果如何。这里主要分享一下LSTM的一些简介和代码。
这个例子展示了如何使用长短时记忆(LSTM)网络对序列数据进行分类。
若要训练深度神经网络对序列数据进行分类,您可以使用LSTM网络。LSTM网络使您能够将序列数据输入到网络中,并根据序列数据的单个时间步长进行预测。
本示例使用了日语元音数据集。这个例子训练一个LSTM网络来识别给定的代表两个连续日语元音的时间序列数据。训练数据包含了9名演讲者的时间序列数据。每个序列有12个特征,并且长度也有所不同。该数据集包含270个训练观察结果和370个测试观察。
- [XTrain,YTrain] = japaneseVowelsTrainData;
- XTrain(1:5)
Visualize the first time series in a plot. Each line corresponds to a feature.
- figure
- plot(XTrain{1}')
- xlabel("Time Step")
- title("Training Observation 1")
- numFeatures = size(XTrain{1},1);
- legend("Feature " + string(1:numFeatures),'Location','northeastoutside')
Prepare Data for Padding
在训练期间,默认情况下,软件会将训练数据分成小批,并填充序列,使它们具有相同的长度。过多的填充物可能会对网络性能产生负面影响。为了防止训练过程添加过多的填充,可以按序列长度对训练数据进行排序,并选择一个小批的大小,以便小批中的序列具有相似的长度。
Get the sequence lengths for each observation.
- numObservations = numel(XTrain);
- for i=1:numObservations
- sequence = XTrain{i};
- sequenceLengths(i) = size(sequence,2);
- end
- [sequenceLengths,idx] = sort(sequenceLengths);
- XTrain = XTrain(idx);
- YTrain = YTrain(idx);
- figure
- bar(sequenceLengths)
- ylim([0 30])
- xlabel("Sequence")
- ylabel("Length")
- title("Sorted Data")
选择一个27的小批量大小,以均匀地划分训练数据,并减少小批量中的填充量。
miniBatchSize = 27;
Define LSTM Network Architecture:
- inputSize = 12;
- numHiddenUnits = 100;
- numClasses = 9;
- layers = [ ...
- sequenceInputLayer(inputSize)
- bilstmLayer(numHiddenUnits,'OutputMode','last')
- fullyConnectedLayer(numClasses)
- softmaxLayer
- classificationLayer]
现在,指定培训选项。指定求解器为“adam”,梯度阈值为1,最大周期数为100。要减少小批量的填充量,请选择27。要将数据填充为与最长序列相同的长度,请指定序列长度为“longest”。要确保数据仍然按序列长度排序,请指定永远不要打乱数据。由于小批量处理很小,序列很短,所以训练更适合CPU。请将“ExecutionEnvironment”指定为“cpu”。若要在GPU上进行训练,如果可用,请将“ExecutionEnvironment”设置为“auto”(这是默认值)。
- maxEpochs = 100;
- miniBatchSize = 27;
- options = trainingOptions('adam', ...
- 'ExecutionEnvironment','cpu', ...
- 'GradientThreshold',1, ...
- 'MaxEpochs',maxEpochs, ...
- 'MiniBatchSize',miniBatchSize, ...
- 'SequenceLength','longest', ...
- 'Shuffle','never', ...
- 'Verbose',0, ...
- 'Plots','training-progress');
net = trainNetwork(XTrain,YTrain,layers,options);
- [XTest,YTest] = japaneseVowelsTestData;
- XTest(1:3)
LSTM网络网络使用相似长度的小批量序列进行训练。确保测试数据以相同的方式组织。按序列长度对测试数据进行排序。
- numObservationsTest = numel(XTest);
- for i=1:numObservationsTest
- sequence = XTest{i};
- sequenceLengthsTest(i) = size(sequence,2);
- end
- [sequenceLengthsTest,idx] = sort(sequenceLengthsTest);
- XTest = XTest(idx);
- YTest = YTest(idx);
对测试数据进行分类。为了减少分类过程中引入的填充量,请将小批量大小设置为27。要应用与训练数据相同的填充,请指定序列长度为'longest'。
- miniBatchSize = 27;
- YPred = classify(net,XTest, ...
- 'MiniBatchSize',miniBatchSize, ...
- 'SequenceLength','longest');
计算预测的分类精度:
acc = sum(YPred == YTest)./numel(YTest)
关于输入数据类型可参考另一篇文章,包含代码和数据类型介绍,便于大家直接上手。链接如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。