LSTM matlab实现
前期在學習特征分類的時候確實花了不少功夫,想去了解一下長短時記憶網絡的分類效果如何。這里主要分享一下LSTM的一些簡介和代碼。
這個例子展示了如何使用長短時記憶(LSTM)網絡對序列數據進行分類。
若要訓練深度神經網絡對序列數據進行分類,您可以使用LSTM網絡。LSTM網絡使您能夠將序列數據輸入到網絡中,并根據序列數據的單個時間步長進行預測。
本示例使用了日語元音數據集。這個例子訓練一個LSTM網絡來識別給定的代表兩個連續日語元音的時間序列數據。訓練數據包含了9名演講者的時間序列數據。每個序列有12個特征,并且長度也有所不同。該數據集包含270個訓練觀察結果和370個測試觀察。
Load Sequence Data 加載日語元音訓練數據。 XTrain是一個包含270個長度12維序列的單元格陣列。Y是標簽“1”,“2”,...,“9”的分類向量,對應于9個揚聲者。XTrain中的條目是包含12行(每個特性為一行)和不同數量的列(每個時間步長為一列)的矩陣。 [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
在訓練期間,默認情況下,軟件會將訓練數據分成小批,并填充序列,使它們具有相同的長度。過多的填充物可能會對網絡性能產生負面影響。為了防止訓練過程添加過多的填充,可以按序列長度對訓練數據進行排序,并選擇一個小批的大小,以便小批中的序列具有相似的長度。
?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")選擇一個27的小批量大小,以均勻地劃分訓練數據,并減少小批量中的填充量。
miniBatchSize = 27;Define LSTM Network Architecture:
定義LSTM網絡架構。將輸入大小指定為12大小的序列(輸入數據的尺寸)。指定一個包含100個隱藏單元的雙向LSTM層,并輸出序列的最后一個元素。最后,包含一個大小為9的全連接層,然后是一個softmax層和一個分類層。如果在預測時可以訪問完整的序列,那么可以在網絡中使用雙向LSTM層。雙向LSTM層在每個時間步長都從完整序列中學習。如果在預測時無法訪問完整的序列,例如,如果正在預測值或一次預測一個時間步長,那么就使用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現在,指定培訓選項。指定求解器為“adam”,梯度閾值為1,最大周期數為100。要減少小批量的填充量,請選擇27。要將數據填充為與最長序列相同的長度,請指定序列長度為“longest”。要確保數據仍然按序列長度排序,請指定永遠不要打亂數據。由于小批量處理很小,序列很短,所以訓練更適合CPU。請將“ExecutionEnvironment”指定為“cpu”。若要在GPU上進行訓練,如果可用,請將“ExecutionEnvironment”設置為“auto”(這是默認值)。
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訓練LSTM網絡。 net = trainNetwork(XTrain,YTrain,layers,options); Test LSTM Network 加載測試集,并將序列分類為揚聲器。加載日語元音測試數據。 XTest是一個包含370個不同長度為12的序列的單元格陣列。YTest是標簽“1”,“2”,...“9”的分類向量,對應于9個揚聲器。 [XTest,YTest] = japaneseVowelsTestData; XTest(1:3)?LSTM網絡網絡使用相似長度的小批量序列進行訓練。確保測試數據以相同的方式組織。按序列長度對測試數據進行排序。
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);對測試數據進行分類。為了減少分類過程中引入的填充量,請將小批量大小設置為27。要應用與訓練數據相同的填充,請指定序列長度為'longest'。
miniBatchSize = 27; YPred = classify(net,XTest, ...'MiniBatchSize',miniBatchSize, ...'SequenceLength','longest');計算預測的分類精度:
acc = sum(YPred == YTest)./numel(YTest) Copyright 2021.11.25 15:17?The MathWorks, Inc.關于輸入數據類型可參考另一篇文章,包含代碼和數據類型介紹,便于大家直接上手。鏈接如下:
LSTM程序輸入數據轉化_Cloudning的博客-CSDN博客為了便于大家快速上手LSTM,這里給出簡單的MATLAB轉換程序,僅供參考。data = readmatrix('original_data.xlsx')'; %% 原始數據label = readmatrix('fault_labels.xlsx'); %% 分類標簽 %% 4個特征值,700組數據%% 劃分測試集和訓練集%% train datadata0 =data(1:4,1:2:700); https://blog.csdn.net/weixin_45168197/article/details/121539274
總結
以上是生活随笔為你收集整理的LSTM matlab实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USB 格式化,提示The volume
- 下一篇: rlocfind matlab,绘制根轨