这个示例展示了如何使用长短期内存(LSTM)网络对序列数据进行分类。
要训练深度神经网络对序列数据进行分类,可以使用LSTM网络。通过LSTM网络,您可以将序列数据输入到网络中,并根据序列数据的各个时间步长进行预测。
本例使用了日本元音数据集如[1]和[2]中描述。这个例子训练的LSTM网络识别代表相继发言两名日本元音扬声器给定的时间序列数据。训练数据包含9个扬声器的时间序列数据。每个序列具有12个特征和长度而变化。该数据集包含270次训练的观测和370个试验观测。
加载日本元音训练数据。XTrain
是含有不同长度的尺寸12的270个序列的单元阵列。Y
是标签“1”、“2”、……的分类向量。,即“9”,对应九个说话者。的条目XTrain
是具有12行(每一行对应一个功能)和不同数量的列(对于每个时间步长的一列)的矩阵。
[XTrain,YTrain] = japaneseVowelsTrainData;XTrain(1:5)
ANS =5×1单元阵列{12x20双}{12x26双}{12x22双}{12x20双}{12x21双}
在可视化的曲线在第一时间系列。每一行对应一个功能。
图图(XTrain {1}')xlabel(“时间步”)标题(“培训观察1”)numFeatures =尺寸(XTrain {1},1);传说(“功能”+字符串(1:numFeatures),'位置',“northeastoutside”)
在训练过程中,默认情况下,软件将训练数据分割成小批,并填充序列,使它们具有相同的长度。过多的填充会对网络性能产生负面影响。
为了防止训练过程中添加过多的填充,可以按序列长度对训练数据进行排序,并选择一个迷你批处理大小,以便迷你批处理中的序列具有类似的长度。下图显示了在对数据排序之前和之后填充序列的效果。
获取每个观测序列的长度。
numObservations =元素个数(XTrain);为I = 1:numObservations序列= XTrain {I};sequenceLengths(ⅰ)=尺寸(序列,2);结束
按序列长度对数据进行排序。
[sequenceLengths, idx] = (sequenceLengths)进行排序;XTrain = XTrain (idx);YTrain = YTrain (idx);
查看排序序列长度的条形图英寸
图巴(sequenceLengths)ylim([0 30])xlabel(“序列”)ylabel(“长度”)标题(“排序数据”)
选择27个小批量,对训练数据进行均匀划分,减少小批量中的填充量。下图演示了添加到序列中的填充。
miniBatchSize = 27个;
定义LSTM网络架构。指定输入大小为尺寸12(输入数据的维数)的序列。指定与100个隐藏单元的双向LSTM层,并输出该序列的最后一个元素。最后,通过包括大小9的完全连接层,接着是SOFTMAX层和分类层指定9个班。
如果你在预测时间访问完整的序列,那么你就可以在网络中使用的双向LSTM层。双向LSTM层从在每个时间步骤中的全序列获悉。如果你没有在预测时间访问完整的序列,例如,如果你的预测值或预测一次在一个时间步,然后使用LSTM层代替。
inputSize = 12;numHiddenUnits = 100;numClasses = 9;层= […sequenceInputLayer inputSize bilstmLayer (numHiddenUnits,“OutputMode”,“最后一次”) fullyConnectedLayer(numClasses)
Layer = 5x1 Layer array with layers: 1”Sequence Input序列Input with 12 dimensions 2”BiLSTM BiLSTM with 100 hidden units 3”full Connected 9 full Connected Layer 4”Softmax Softmax 5”分类输出crossentropyex
现在,指定培训选项。指定求解器为“亚当”
时,梯度阈值为1,最大epoch数为100。为了减少小批量中的填充量,选择27的小批量大小。若要填充数据使其具有与最长序列相同的长度,请指定序列长度为'最长'
。为了确保数据的遗体由排序序列长度,指定从不洗牌的数据。
由于迷你批是小的和短的序列,训练更适合CPU。指定“ExecutionEnvironment”
是“cpu”
。要在GPU训练,如果有的话,集“ExecutionEnvironment”
来“汽车”
(这是默认值)。
maxEpochs = 100;miniBatchSize = 27个;选择= trainingOptions (“亚当”,…“ExecutionEnvironment”,“cpu”,…'GradientThreshold'1,…“MaxEpochs”maxEpochs,…“MiniBatchSize”,miniBatchSize,…'SequenceLength','最长',…“洗牌”,“永远”,…“放牧”,0,…“阴谋”,“训练进步”);
使用指定的训练选项训练LSTM网络trainNetwork
。
净= trainNetwork(XTrain,YTrain,层,选项);
加载测试集并将序列分类为扬声器。
加载日本元音的测试数据。XTEST
是一个单元格数组,包含370个12维的可变长度序列。YTest
是标签“1”、“2”、“…”的分类向量。9”,相当于九位发言者。
[XTEST,YTest] = japaneseVowelsTestData;XTEST(1:3)
ANS =3×1单元阵列{12x19双} {12x17双} {12x19双}
LSTM网络净
使用相似长度的小批序列进行训练。确保测试数据以相同的方式组织。根据序列长度对测试数据进行排序。
numObservationsTest = numel(XTEST);为I = 1:numObservationsTest序列= XTEST {I};sequenceLengthsTest(ⅰ)=尺寸(序列,2);结束[sequenceLengthsTest,IDX] =排序(sequenceLengthsTest);XTEST = XTEST(IDX);YTest = YTest(IDX);
分类测试数据。为了减少填充的由分类过程中引入的量,小批量大小设置为27到应用相同的填充作为训练数据,指定序列长度为'最长'
。
miniBatchSize = 27个;YPred =分类(净,XTEST,…“MiniBatchSize”,miniBatchSize,…'SequenceLength','最长');
计算预测的分类精度。
ACC =总和(YPred == YTest)./ numel(YTest)
ACC = 0.9730
[1] M。工藤,J.富山,和M. Shimbo。“多维曲线分类中穿出的地区。”模式识别的字母。卷。20,第11-13页1103-1111。
[2]UCI机器学习库:日本元音数据集。https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels
bilstmLayer
|lstmLayer
|sequenceInputLayer
|trainNetwork
|trainingOptions