此示例显示如何使用长短短期内存(LSTM)网络对序列数据进行分类。
要培训深度神经网络来对序列数据进行分类,可以使用LSTM网络。LSTM网络使您可以将序列数据输入到网络中,并基于序列数据的各个时间步骤进行预测。
此示例使用如[1]和[2]中所述的日语元音数据集。该示例列举了LSTM网络,以识别给定的时间序列数据代表连续使用的两个日本元音。培训数据包含九个扬声器的时间序列数据。每个序列具有12个特征,长度变化。数据集包含270个培训观察和370个测试观察。
加载日语元音培训数据。XTrain.
是包含不同长度的270个尺寸12的细胞阵列。y
是标签“1”,“2”,......,“9”的分类向量,它对应九个扬声器。参赛作品XTrain.
是具有12行的矩阵(每个特征的一行)和不同数量的列(每次步骤一列)。
[Xtrain,Ytrain] = JapanesevowelstrainData;XTrain(1:5)
ans =.5×1个单元阵列{12×20 double} {12×26 double} {12×22 double} {12×20 double} {12×21双}
在绘图中可视化第一次序列。每行对应于特征。
图绘图(XTrain {1}')XLabel(“时间步骤”) 标题(“培训观察1”)numfeatures = size(xtrain {1},1);传奇(“特征 ”+字符串(1:numfeatures),'地点'那“东北朝”)
在培训期间,默认情况下,软件将培训数据分割为迷你批次,并填充序列,使它们具有相同的长度。填充太多可能对网络性能产生负面影响。
为防止培训过程添加太多填充,您可以按顺序对培训数据进行排序,并选择迷你批次尺寸,以便在迷你批处理中的序列具有相似的长度。下图显示了排序数据之前和之后的填充序列的效果。
获取每个观察的序列长度。
numobservations = numel(xtrain);为了i = 1:numobservations sequence = xtrain {i};Sequencelengths(i)=大小(序列,2);结尾
按顺序长度对数据进行排序。
[Sequencelengths,IDx] =排序(Sequencelength);XTrain = XTrain(IDX);YTrain = Ytrain(IDX);
在条形图中查看排序的序列长度。
图栏(Sequencelength)Ylim([030])XLabel(“顺序”)ylabel(“长度”) 标题(“排序数据”)
选择Mini-Batch大小为27,以均匀地将培训数据分开,并减少较小批次中的填充量。下图说明了添加到序列的填充。
minibatchsize = 27;
定义LSTM网络架构。将输入大小指定为尺寸12的序列(输入数据的尺寸)。指定具有100个隐藏单元的双向LSTM层,并输出序列的最后一个元素。最后,通过包括一个完全连接的大小9层来指定九类,然后是Softmax层和分类层。
如果您可以在预测时间访问完整序列,则可以在网络中使用双向LSTM层。双向LSTM层在每次步骤中从完整序列学习。例如,如果您没有访问预测时间的完整序列,例如,如果您是预测值或一次预测一次,则使用LSTM层。
输入= 12;numhidendunits = 100;numclasses = 9;层= [......sequenceInputLayer(InputSize)BilstMlayer(numhidentunits,'OutputMode'那'最后的')全连接列(numclasses)softmaxlayer类层]
图层= 5×1层阵列,图层:1''序列输入序列输入,带12尺寸2''Bilstm Bilstm,具有100个隐藏单元3''完全连接的9完全连接的第4层''softmax Softmax 5''分类输出CrossentRopyex
现在,指定培训选项。指定求解器'亚当'
,梯度阈值为1,以及最大时期为100.为了减少迷你批次中的填充量,选择mini批量大小为27.要填充数据以具有与相同的长度最长序列,指定序列长度'最长'
。为确保数据保持按顺序长度保持排序,请指定永远不会破坏数据。
由于迷你批次具有短序列,因此培训更适合CPU。指定'executionenvironment'
成为'中央处理器'
。在GPU上训练,如果有的话,设置'executionenvironment'
到'汽车'
(这是默认值)。
maxepochs = 100;minibatchsize = 27;选项=培训选项('亚当'那......'executionenvironment'那'中央处理器'那......'gradientthreshold',1,......'maxepochs',maxepochs,......'minibatchsize',小匹马,......'sequencelength'那'最长'那......'洗牌'那'绝不'那......'verbose',0,......'plots'那'培训 - 进步');
使用指定的培训选项列车将LSTM网络列入Trainnetwork.
。
net = trainnetwork(xtrain,ytrain,图层,选项);
加载测试集并将序列分类为扬声器。
加载日语元音测试数据。XTest.
是包含不同长度的370尺寸12的细胞阵列。ytest.
是标签“1”,“2”,...“9”的分类向量,它与九个扬声器相对应。
[xtest,ytest] =日本韦沃尔斯特迪塔XTEST(1:3)
ans =.3×1个单元阵列{12×19双} {12×17双} {12×19双}
LSTM网络网
使用Mini-批次的类似长度序列进行培训。确保以相同的方式组织测试数据。按顺序长度对测试数据进行排序。
numobservationstest = numel(xtest);为了i = 1:numobservationstest序列= xtest {i};SequenceLengdentStest(i)=大小(序列,2);结尾[SequenceLengdentStest,IDX] =排序(SequenceLengdentStest);xtest = xtest(idx);ytest = ytest(idx);
分类测试数据。为减少分类过程引入的填充量,将迷你批量大小设置为27.要将与训练数据相同的填充,请指定序列长度'最长'
。
minibatchsize = 27;ypred =分类(net,xtest,......'minibatchsize',小匹马,......'sequencelength'那'最长');
计算预测的分类准确性。
ACC = SUM(YPRED == ytest)./ numel(ytest)
ACC = 0.9730.
[1] M. Kudo,J. Toyama和M. Shimbo。“使用过度区域的多维曲线分类。”模式识别字母。卷。20,第11-13页,第1103-1111页。
[2]UCI机器学习存储库:日语元音数据集。https://archive.ics.uci.edu/ml/datasets/japanese+vowels.
Bilstmlayer.
|lstmlayer.
|sequenceInputlayer.
|培训选项
|Trainnetwork.