主要内容

딥러닝을사용한시퀀스분류

이예제에서는장단기기억(LSTM)신경망을사용하여시퀀스데이터를분류하는방법을보여줍니다。

시퀀스데이터를분류하도록심층신경망을훈련시키기위해LSTM신경망을사용할수있습니다。LSTM신경망을사용하면신경망에시퀀스데이터를입력하고시퀀스데이터의개별시간스텝을기준으로예측을수행할수있습니다。

이예제에서는[1]과[2]에서설명한日本元音데이터세트를사용합니다。이예제에서는연속해서발화된2개의일본어모음을나타내는시계열데이터를주고화자를인식하도록LSTM신경망을훈련시킵니다。훈련데이터는화자9명의시계열데이터를포함합니다。각시퀀스는12개의특징을가지며길이가서로다릅니다。데이터세트는270개의훈련관측값과370개의테스트관측값을포함합니다。

시퀀스데이터불러오기

日语元音훈련데이터를불러옵니다。XTrain은12개차원으로된서로다른길이의시퀀스270개를포함하는셀형배열입니다。Y는9명의화자각각에대응하는레이블"1","2",…,“9”로구성된分类형벡터입니다。XTrain의요소는각특징에대해하나의행을갖는12개의행과각시간스텝에대해하나의열을갖는가변개수의열로이루어진행렬입니다。

[XTrain,YTrain] = japevowelstraaindata;XTrain (1:5)
ans =5×1单元格数组{12x20 double} {12x26 double} {12x22 double} {12x20 double} {12x21 double}

첫번째시계열을플롯으로시각화합니다。선은각각하나의특징에대응됩니다。

图(XTrain{1}') xlabel(“时间步”)标题(“训练观察1”) numFeatures = size(XTrain{1},1);传奇(“特性”+字符串(1:numFeatures),位置=“northeastoutside”

图中包含一个axes对象。标题为Training Observation 1的坐标轴对象包含12个类型为line的对象。这些对象代表特性1、特性2、特性3、特性4、特性5、特性6、特性7、特性8、特性9、特性10、特性11、特性12。

채우기를위해데이터준비하기

기본적으로훈련중에훈련데이터가미니배치로분할되고모든시퀀스의길이가같아지도록시퀀스가채워집니다。너무많이채우면신경망성능이저하될수있습니다。

훈련과정에서너무많이채워지지않도록하려면시퀀스길이를기준으로시퀀스데이터를정렬한다음미니배치크기를선택하여하나의미니배치에속한시퀀스들이비슷한길이를갖도록합니다。다음그림에서는데이터를정렬하기전과후의시퀀스채우기의효과를보여줍니다。

각관측값에대한시퀀스길이를가져옵니다。

numObservations = numel(XTrain);i=1:numObservations sequence = XTrain{i};sequenceLengths(i) = size(sequence,2);结束

시퀀스길이를기준으로데이터를정렬합니다。

[sequenceLengths,idx] = sort(sequenceLengths);XTrain = XTrain(idx);YTrain = YTrain(idx);

정렬된시퀀스길이를막대차트로시합니다。

图栏(sequenceLengths) ylim([0 30]) xlabel([0 30])“序列”) ylabel (“长度”)标题(“排序数据”

图中包含一个axes对象。标题为Sorted Data的axes对象包含一个类型为bar的对象。

미니배치크기를27로선택하여훈련데이터를균등하게나누고미니배치에채워지는양을줄입니다。다음그림에서는시퀀스에더해진채우기를보여줍니다。

miniBatchSize = 27;

LSTM신경망아키텍처정의하기

LSTM신경망아키텍처를정의합니다。시퀀스의입력크기를12(입력데이터의차원)로지정합니다。은닉유닛100개를갖는양방향LSTM계층을지정하고시퀀스의마지막요소를출력합니다。마지막으로,크기가인9완전연결계층을포함하여9개의클래스를지정하고,이어서소프트맥스계층과분류계층을지정합니다。

예측시점에전체시퀀스에액세스할수있다면신경망에서양방향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로지정하고,최대时代횟수를50으로지정합니다。데이터가가장긴시퀀스의길이와같도록데이터를채우려면시퀀스길이를“最长”로지정하십시오。데이터가시퀀스길이를기준으로정렬된상태를유지하도록하려면데이터가섞이지않도록지정하십시오。

미니배치가짧은시퀀스를갖는작은배치이기때문에훈련에는CPU를사용하는것이더적합합니다。ExecutionEnvironment옵션을“cpu”로설정합니다。Gpu를사용할수있는경우Gpu를훈련시키려면ExecutionEnvironment옵션을“汽车”(디폴트값)로설정하십시오。

options = trainingOptions(“亚当”...ExecutionEnvironment =“cpu”...GradientThreshold = 1,...MaxEpochs = 50,...MiniBatchSize = MiniBatchSize,...SequenceLength =“最长”...洗牌=“从不”...Verbose = 0,...情节=“训练进步”);

LSTM신경망훈련시키기

trainNetwork를사용하여지정된훈련옵션으로LSTM신경망을훈련시킵니다。

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

{

LSTM신경망테스트하기

테스트세트를불러오고시퀀스를화자별로분류합니다。

日语元音테스트데이터를불러옵니다。XTest는12개차원으로된서로다른길이의시퀀스370개를포함하는셀형배열입니다。欧美는9명의화자에대응하는레이블"1","2",…“9”로구성된分类형벡터입니다。

[XTest,YTest] = japevowelstestdata;XTest (1:3)
ans =3×1单元格数组{12x19 double} {12x17 double} {12x19 double}

LSTM신경망은비슷한길이를갖는시퀀스를포함하는미니배치를사용하여훈련되었습니다。테스트데이터도같은방식으로구성되도록합니다。시퀀스길이를기준으로테스트데이터를정렬합니다。

numObservationsTest = numel(XTest);i=1:numObservationsTest sequence = XTest{i};sequenceLengthsTest(i) = size(sequence,2);结束[sequenceLengthsTest,idx] = sort(sequenceLengthsTest);XTest = XTest(idx);YTest = YTest(idx);

테스트데이터를분류합니다。분류과정에서채워지는양을줄이려면훈련에사용된것과동일하게미니배치크기를지정하십시오。훈련데이터와동일한양의채우기를적용하려면시퀀스길이를“最长”로지정하십시오。

YPred = class (net,XTest,...MiniBatchSize = MiniBatchSize,...SequenceLength =“最长”);

예측의분류정확도를계산합니다。

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

참고 문헌

[1]工藤先生,富山先生,Shimbo先生。“利用穿过区域的多维曲线分类”。模式识别字母。第20卷第11-13期,第1103-1111页。

UCI机器学习知识库:日语元音数据集。https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

참고 항목

||||

관련 항목