LSTM matlab实现
前期在學(xué)習(xí)特征分類的時(shí)候確實(shí)花了不少功夫,想去了解一下長短時(shí)記憶網(wǎng)絡(luò)的分類效果如何。這里主要分享一下LSTM的一些簡介和代碼。
這個(gè)例子展示了如何使用長短時(shí)記憶(LSTM)網(wǎng)絡(luò)對序列數(shù)據(jù)進(jìn)行分類。
若要訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)對序列數(shù)據(jù)進(jìn)行分類,您可以使用LSTM網(wǎng)絡(luò)。LSTM網(wǎng)絡(luò)使您能夠?qū)⑿蛄袛?shù)據(jù)輸入到網(wǎng)絡(luò)中,并根據(jù)序列數(shù)據(jù)的單個(gè)時(shí)間步長進(jìn)行預(yù)測。
本示例使用了日語元音數(shù)據(jù)集。這個(gè)例子訓(xùn)練一個(gè)LSTM網(wǎng)絡(luò)來識別給定的代表兩個(gè)連續(xù)日語元音的時(shí)間序列數(shù)據(jù)。訓(xùn)練數(shù)據(jù)包含了9名演講者的時(shí)間序列數(shù)據(jù)。每個(gè)序列有12個(gè)特征,并且長度也有所不同。該數(shù)據(jù)集包含270個(gè)訓(xùn)練觀察結(jié)果和370個(gè)測試觀察。
Load Sequence Data 加載日語元音訓(xùn)練數(shù)據(jù)。 XTrain是一個(gè)包含270個(gè)長度12維序列的單元格陣列。Y是標(biāo)簽“1”,“2”,...,“9”的分類向量,對應(yīng)于9個(gè)揚(yáng)聲者。XTrain中的條目是包含12行(每個(gè)特性為一行)和不同數(shù)量的列(每個(gè)時(shí)間步長為一列)的矩陣。 [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
在訓(xùn)練期間,默認(rèn)情況下,軟件會將訓(xùn)練數(shù)據(jù)分成小批,并填充序列,使它們具有相同的長度。過多的填充物可能會對網(wǎng)絡(luò)性能產(chǎn)生負(fù)面影響。為了防止訓(xùn)練過程添加過多的填充,可以按序列長度對訓(xùn)練數(shù)據(jù)進(jìn)行排序,并選擇一個(gè)小批的大小,以便小批中的序列具有相似的長度。
?Get the sequence lengths for each observation.
numObservations = numel(XTrain); for i=1:numObservationssequence = XTrain{i};sequenceLengths(i) = size(sequence,2); end Sort the data by sequence length. [sequenceLengths,idx] = sort(sequenceLengths); XTrain = XTrain(idx); YTrain = YTrain(idx); View the sorted sequence lengths in a bar chart. figure bar(sequenceLengths) ylim([0 30]) xlabel("Sequence") ylabel("Length") title("Sorted Data")選擇一個(gè)27的小批量大小,以均勻地劃分訓(xùn)練數(shù)據(jù),并減少小批量中的填充量。
miniBatchSize = 27;Define LSTM Network Architecture:
定義LSTM網(wǎng)絡(luò)架構(gòu)。將輸入大小指定為12大小的序列(輸入數(shù)據(jù)的尺寸)。指定一個(gè)包含100個(gè)隱藏單元的雙向LSTM層,并輸出序列的最后一個(gè)元素。最后,包含一個(gè)大小為9的全連接層,然后是一個(gè)softmax層和一個(gè)分類層。如果在預(yù)測時(shí)可以訪問完整的序列,那么可以在網(wǎng)絡(luò)中使用雙向LSTM層。雙向LSTM層在每個(gè)時(shí)間步長都從完整序列中學(xué)習(xí)。如果在預(yù)測時(shí)無法訪問完整的序列,例如,如果正在預(yù)測值或一次預(yù)測一個(gè)時(shí)間步長,那么就使用LSTM層來代替。 inputSize = 12; numHiddenUnits = 100; numClasses = 9; layers = [ ...sequenceInputLayer(inputSize)bilstmLayer(numHiddenUnits,'OutputMode','last')fullyConnectedLayer(numClasses)softmaxLayerclassificationLayer] layers = ????????????????5×1 Layer array with layers: ????????????????????????4 1 '' Sequence Input Sequence input with 12 dimensions ????????????????????????2 '' BiLSTM BiLSTM with 100 hidden units ????????????????????????3 '' Fully Connected 9 fully connected layer ????????????????????????4 '' Softmax softmax ????????????????????????5 '' Classification Output crossentropyex現(xiàn)在,指定培訓(xùn)選項(xiàng)。指定求解器為“adam”,梯度閾值為1,最大周期數(shù)為100。要減少小批量的填充量,請選擇27。要將數(shù)據(jù)填充為與最長序列相同的長度,請指定序列長度為“longest”。要確保數(shù)據(jù)仍然按序列長度排序,請指定永遠(yuǎn)不要打亂數(shù)據(jù)。由于小批量處理很小,序列很短,所以訓(xùn)練更適合CPU。請將“ExecutionEnvironment”指定為“cpu”。若要在GPU上進(jìn)行訓(xùn)練,如果可用,請將“ExecutionEnvironment”設(shè)置為“auto”(這是默認(rèn)值)。
maxEpochs = 100; miniBatchSize = 27; options = trainingOptions('adam', ...'ExecutionEnvironment','cpu', ...'GradientThreshold',1, ...'MaxEpochs',maxEpochs, ...'MiniBatchSize',miniBatchSize, ...'SequenceLength','longest', ...'Shuffle','never', ...'Verbose',0, ...'Plots','training-progress'); Train LSTM Network 使用trainNetwork訓(xùn)練LSTM網(wǎng)絡(luò)。 net = trainNetwork(XTrain,YTrain,layers,options); Test LSTM Network 加載測試集,并將序列分類為揚(yáng)聲器。加載日語元音測試數(shù)據(jù)。 XTest是一個(gè)包含370個(gè)不同長度為12的序列的單元格陣列。YTest是標(biāo)簽“1”,“2”,...“9”的分類向量,對應(yīng)于9個(gè)揚(yáng)聲器。 [XTest,YTest] = japaneseVowelsTestData; XTest(1:3)?LSTM網(wǎng)絡(luò)網(wǎng)絡(luò)使用相似長度的小批量序列進(jìn)行訓(xùn)練。確保測試數(shù)據(jù)以相同的方式組織。按序列長度對測試數(shù)據(jù)進(jìn)行排序。
numObservationsTest = numel(XTest); for i=1:numObservationsTestsequence = XTest{i};sequenceLengthsTest(i) = size(sequence,2); end [sequenceLengthsTest,idx] = sort(sequenceLengthsTest); XTest = XTest(idx); YTest = YTest(idx);對測試數(shù)據(jù)進(jìn)行分類。為了減少分類過程中引入的填充量,請將小批量大小設(shè)置為27。要應(yīng)用與訓(xùn)練數(shù)據(jù)相同的填充,請指定序列長度為'longest'。
miniBatchSize = 27; YPred = classify(net,XTest, ...'MiniBatchSize',miniBatchSize, ...'SequenceLength','longest');計(jì)算預(yù)測的分類精度:
acc = sum(YPred == YTest)./numel(YTest) Copyright 2021.11.25 15:17?The MathWorks, Inc.關(guān)于輸入數(shù)據(jù)類型可參考另一篇文章,包含代碼和數(shù)據(jù)類型介紹,便于大家直接上手。鏈接如下:
LSTM程序輸入數(shù)據(jù)轉(zhuǎn)化_Cloudning的博客-CSDN博客為了便于大家快速上手LSTM,這里給出簡單的MATLAB轉(zhuǎn)換程序,僅供參考。data = readmatrix('original_data.xlsx')'; %% 原始數(shù)據(jù)label = readmatrix('fault_labels.xlsx'); %% 分類標(biāo)簽 %% 4個(gè)特征值,700組數(shù)據(jù)%% 劃分測試集和訓(xùn)練集%% train datadata0 =data(1:4,1:2:700); https://blog.csdn.net/weixin_45168197/article/details/121539274
總結(jié)
以上是生活随笔為你收集整理的LSTM matlab实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USB 格式化,提示The volume
- 下一篇: rlocfind matlab,绘制根轨