利用深度学习进行序列分类
这个例子展示了如何使用长短期记忆(LSTM)网络对序列数据进行分类。
为了训练深度神经网络对序列数据进行分类,可以使用LSTM网络。LSTM网络使您能够将序列数据输入到网络中,并根据序列数据的单个时间步进行预测。
本例使用[1]和[2]中描述的日语元音数据集。本例训练一个LSTM网络,在给定的时间序列数据中识别说话人连续说出的两个日语元音。训练数据包含9位演讲者的时间序列数据。每个序列有12个特征,长度不同。数据集包含270个训练观测值和370个测试观测值。
加载序列数据
加载日语元音训练数据。XTrain
是包含270个长度不等的12维序列的单元格数组。Y
是标签“1”,“2”,…,“9”,分别对应9位说话者。的条目XTrain
矩阵有12行(一行表示每个特征)和不同数量的列(一列表示每个时间步)。
[XTrain, YTrain] = japaneseVowelsTrainData;XTrain (1:5)
ans =5×1单元阵列{12x20 double} {12x26 double} {12x22 double} {12x20 double} {12x21 double}
在一个情节中想象第一个时间序列。每一行对应一个特征。
图绘制(XTrain{1}”)包含(“时间步”)标题(“训练观察1”) numFeatures = size(XTrain{1},1);传奇(“特性”+字符串(1:numFeatures),位置=“northeastoutside”)
准备填充数据
默认情况下,在训练过程中,软件将训练数据分成小批,并填充序列,使它们具有相同的长度。过多的填充会对网络性能产生负面影响。
为了防止训练过程添加过多填充,可以按序列长度对训练数据进行排序,并选择一个小批大小,以便小批中的序列具有相似的长度。下图显示了填充序列在数据排序前后的效果。
获取每个观察的序列长度。
numObservations =元素个数(XTrain);为i=1:numObservations sequence = XTrain{i};sequenceLengths (i) =(序列,2)大小;结束
按序列长度对数据进行排序。
[sequenceLengths, idx] = (sequenceLengths)进行排序;XTrain = XTrain (idx);YTrain = YTrain (idx);
在柱状图中查看已排序的序列长度。
图栏(sequenceLengths) ylim([0 30]) xlabel([0 30])“序列”) ylabel (“长度”)标题(“排序数据”)
选择27个小批大小,以均匀分配训练数据,减少小批中的填充量。下图说明了添加到序列中的填充。
miniBatchSize = 27个;
定义LSTM网络架构
定义LSTM网络架构。指定输入大小为大小为12的序列(输入数据的尺寸)。指定一个双向LSTM层,包含100个隐藏单元,并输出序列的最后一个元素。最后,指定9个类,包括一个大小为9的完全连接层,然后是一个softmax层和一个分类层。
如果在预测时可以访问完整的序列,那么可以在网络中使用双向LSTM层。双向LSTM层在每个时间步从完整的序列中学习。如果您在预测时无法访问完整的序列,例如,如果您正在预测值或每次预测一个时间步骤,则应使用LSTM层。
inputSize = 12;numHiddenUnits = 100;numClasses = 9;层= [...sequenceInputLayer inputSize bilstmLayer (numHiddenUnits OutputMode =“最后一次”fulllyconnectedlayer (numClasses)
2”BiLSTM BiLSTM与100个隐藏单元3”全连接9全连接层4”Softmax Softmax 5”分类输出crossentropyex
现在,指定培训选项。指定要的求解器“亚当”
,梯度阈值为1,最大epoch数为50。要将数据填充为与最长序列具有相同的长度,请将序列长度指定为“最长”
.要确保数据保持按序列长度排序,请指定永不打乱数据。
由于小批次的序列较短,训练更适合于CPU。设置ExecutionEnvironment
选项“cpu”
.如果需要在GPU上进行训练,请设置ExecutionEnvironment
选项“汽车”
(这是默认值)。
选择= trainingOptions (“亚当”,...ExecutionEnvironment =“cpu”,...GradientThreshold = 1,...MaxEpochs = 50,...MiniBatchSize = MiniBatchSize,...SequenceLength =“最长”,...洗牌=“从不”,...Verbose = 0,...情节=“训练进步”);
火车LSTM网络
使用指定的训练选项训练LSTM网络trainNetwork
.
网= trainNetwork (XTrain、YTrain层,选择);
测试LSTM网络
加载测试集并将序列分类到扬声器中。
加载日语元音测试数据。XTest
是包含370个长度不等的12维序列的单元格数组。欧美
是标签“1”,“2”,…“9”,对应9位说话者。
[XTest,欧美]= japaneseVowelsTestData;XTest (1:3)
ans =3×1单元阵列{12x19 double} {12x17 double} {12x19 double}
LSTM网络网
使用长度相似的小批次序列进行训练。确保测试数据以相同的方式组织。按序列长度对测试数据进行排序。
numObservationsTest =元素个数(XTest);为i=1:numObservationsTest sequence = XTest{i};sequenceLengthsTest (i) =(序列,2)大小;结束[sequenceLengthsTest, idx] = (sequenceLengthsTest)进行排序;XTest = XTest (idx);欧美=欧美(idx);
对测试数据进行分类。要减少分类过程引入的填充量,请指定用于训练的相同小批大小。若要应用与训练数据相同的填充,请指定序列长度为“最长”
.
XTest YPred =分类(净,...MiniBatchSize = MiniBatchSize,...SequenceLength =“最长”);
计算预测的分类精度。
acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9622
参考文献
[1]工藤先生,富山先生,Shimbo先生。“利用穿过区域的多维曲线分类”。模式识别的字母.第20卷第11-13期,第1103-1111页。
[2]UCI机器学习库:日语元音数据集.https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels
另请参阅
trainNetwork
|trainingOptions
|lstmLayer
|bilstmLayer
|sequenceInputLayer