深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类
一、概述
關于LSTM同系列的前一篇文章寫的是利用LSTM網絡對電力負荷進行預測【LSTM預測】,其本質是sequence-to-sequence problems,序列到序列的預測應用。這里做一下sequence-to-label classification problems,序列到標簽的分類應用【LSTM分類】。關于LSTM的網絡特性不再贅述。
本篇博文的具體示例是對給定的電力負荷進行分類,電力負荷數據格式為每日96個數據點的一維時間序列值,每條負荷數據均對應一個類型標簽,總共類別為6類。其他的例子可以參考官網給定的japaneseVowelsTrainData 案例。
負荷數據是某電力公司內部數據,鑒于保密要求,這里僅描述數據格式,負荷數據集不提供。
- 類別:6
- 數據長度:96
- 訓練數據條數:9821
- 測試數據條數:2456
二、數據格式轉換
首先看一下需要傳到LSTM網絡的訓練參數格式。
trainedNet = trainNetwork(C, Y, layers, options);它必須從序列輸入層開始,C是一個包含序列或時間序列預測器的元胞數組。C是d行1列,d代表有多少個訓練樣本,每個訓練樣本又包括N行M列,N代表訓練樣本的數據維度,M代表序列長度,y是標簽的分類向量,是categorical類型。
因此,訓練數據應該轉換成元胞數組,訓練數據標簽應該轉換成categorical類型。
2.1 訓練數據格式轉換
代碼如下所示,用XTrain和YTrain來代替上述訓練網絡中的C和Y。
dataStandardlized是原始數據標準化后的數據,dataStandardlizedLable是每條數據對應的類別標簽,num型。獲得XTrain需要通過XTrainData轉換成元胞數組,XTrain每一行是一條負荷訓練樣本數據,即1*96的數據。
YTrain是categorical類別數組,可以通過categorial函數轉換,但是輸入參數時字符元胞數組,因此現將XTrainLabel轉換成字符矩陣,然后再將矩陣轉換成元胞數組,最后轉換成categorical類型。
%提取訓練樣本數據 XTrainSize = 9821; XTrainData = dataStandardlized(1:XTrainSize,:); XTrainLabel = dataStandardlizedLable(1:XTrainSize,:);%XTrain for i = 1:size(XTrainData,1)XTrain{i,1} = XTrainData(i,:); end%YTrain TrainstrLable = num2str(XTrainLabel);% num to str for i = 1:size(XTrainData,1)% str matrix to cellTraincellLable{i,1} = TrainstrLable(i,1); end YTrain = categorical(TraincellLable);%cell to categorical2.2 測試數據格式轉換
測試數據格式轉換方法與訓練數據格式轉換相同,見代碼。
%提取測試樣本 XTestData = dataStandardlized(1+XTrainSize:end,:); XTestLabel = dataStandardlizedLable(1+XTrainSize:end,:); %XTest for i = 1:size(XTestData,1)XTest{i,1} = XTestData(i,:); end %YTest TeststrLable = num2str(TestLabel);% num to str for i = 1:size(XTestData,1)TestcellLable{i,1} = TeststrLable(i,1);% str matrix to cell end YTest = categorical(TestcellLable);%cell to categorical三、網絡參數設置
前面講到了TrainNetwork的C和Y,這里描述一下網絡參數?layers和options的具體配置。
3.1 layers
layers用于定義訓練網絡的架構,按照網絡架構的先后,依次填寫到layers的每一行。
首先定義LSTM網絡架構:
- 將輸入大小指定為序列大小 1(輸入數據的維度,指同一時間下的數據維度)
- 指定具有 100 個隱含單元的雙向 LSTM 層,并輸出序列的最后一個元素。
- 指定六個類,包含大小為 1 的全連接層,后跟 softmax 層和分類層。
具體地:??
3.2 options
options用于指定訓練網絡的優化選項,通過調用trainingOptions進行設置。
此處指定訓練選項:
- 求解器為 'adam'
- 梯度閾值為 1,最大輪數為 100。
- 100作為小批量數。
- 填充數據以使長度與最長序列相同,序列長度指定為 'longest'。
- 數據保持按序列長度排序的狀態,不打亂數據。
- 'ExecutionEnvironment' 指定為 'cpu',設定為'auto'表明使用GPU。
四、訓練LSTM網絡
將前面準備好的參數送入訓練網絡,等待訓練結束。
net = trainNetwork(XTrain,YTrain,layers,options);我這里的訓練時間非常長,當然訓練過程與隱藏節點數,訓練數據的維度和訓練次數以及電腦配置有關系,我這里單CPU訓練耗時112分鐘。
五、利用LSTM網絡進行分類
利用標準結果和分類結果計算分類的正確率。
使用classify函數進行分類,同訓練過程一樣,仍然要指定小批量大小為100,指定組內數據按照最長的數據填充。
miniBatchSize = 100; YPred = classify(net,XTest, ...'SequenceLength','longest','MiniBatchSize',miniBatchSize); %計算分類準確度 acc = sum(YPred == YTest)./numel(YTest)可以看到分類精度達到92%,還是很不錯了。
------分享知識,讓人愉悅,原創博文,支持請點贊。
總結
以上是生活随笔為你收集整理的深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【历史上的今天】9 月 16 日:乔布斯
- 下一篇: android自定义控件是一个 内部类