-
大小: 5KB文件類型: .m金幣: 1下載: 0 次發(fā)布日期: 2024-01-31
- 語言: Matlab
- 標簽: DeepLearning??
資源簡介
MATLAB復(fù)現(xiàn)LSTM網(wǎng)絡(luò)學(xué)習(xí)預(yù)測,此示例說明如何使用長期短期記憶 (LSTM) 網(wǎng)絡(luò)預(yù)測時序數(shù)據(jù)。要預(yù)測序列在將來時間步的值,您可以訓(xùn)練“序列到序列”回歸 LSTM 網(wǎng)絡(luò),其中響應(yīng)是將值移位了一個時間步的訓(xùn)練序列。也就是說,在輸入序列的每個時間步,LSTM 網(wǎng)絡(luò)都學(xué)習(xí)預(yù)測下一個時間步的值。
代碼片段和文件信息
clc;
clear;
data?=?chickenpox_dataset;%加載數(shù)據(jù)集?chickenpox_dataset是一個函數(shù)
data?=?[data{:}];%將數(shù)據(jù)集變?yōu)閿?shù)組的形式,此時得到的是一個1*n維的數(shù)組,n代表n個時刻,其中存儲的是每個時刻的值,即對于時序預(yù)測,只有發(fā)生的順序,不存在實際的時間?
figure;?%創(chuàng)建一個用來顯示圖形輸出的一個窗口對象。各種屬性都使用的默認設(shè)置??
plot(data);?%若data是向量,則以data的分量為縱坐標,以元素序號為橫坐標,用直線以此連接數(shù)據(jù)點,繪制曲線。若y為實矩陣,則按列繪制每列對應(yīng)的曲線?
xlabel(“Month“);?%縱坐標的名稱?
ylabel(“Cases“);?%橫坐標的名稱?
title(“Monthy?Cases?of?Chickenpox“);?%曲線圖的標題
%對訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)進行分區(qū)。序列的前?90%?用于訓(xùn)練,后?10%?用于測試
numTimeStepsTrain?=?floor(0.9*numel(data));%將90%的數(shù)據(jù)設(shè)定為訓(xùn)練集
dataTrain?=?data(1:numTimeStepsTrain+1);%定義訓(xùn)練集?
dataTest?=?data(numTimeStepsTrain+1:end);%定義測試集
%為了獲得較好的擬合并防止訓(xùn)練發(fā)散,將訓(xùn)練數(shù)據(jù)標準化為具有零均值和單位方差。在預(yù)測時,您必須使用與訓(xùn)練數(shù)據(jù)相同的參數(shù)來標準化測試數(shù)據(jù)。
mu?=?mean(dataTrain);%求均值,為以后的歸一化做準備
sig?=?std(dataTrain);%求均差,為以后的歸一化做準備
dataTrainStandardized?=?(dataTrain?-?mu)?/?sig;%歸一化,這里方式數(shù)據(jù)發(fā)散
%要預(yù)測序列在將來時間步的值,請將響應(yīng)指定為將值移位了一個時間步的訓(xùn)練序列。
%也就是說,在輸入序列的每個時間步,LSTM?網(wǎng)絡(luò)都學(xué)習(xí)預(yù)測下一個時間步的值。預(yù)測變量是沒有最終時間步的訓(xùn)練序列。
XTrain?=?dataTrainStandardized(1:end-1);
YTrain?=?dataTrainStandardized(2:end);
%創(chuàng)建LSTM回歸網(wǎng)絡(luò)。指定LSTM層有200個隱含單元。
numFeatures?=?1;%輸入特征維數(shù)?
numResponses?=?1;%輸出特征維數(shù)?
numHiddenUnits?=?200;%每一層lsmt網(wǎng)絡(luò)中存在多少神經(jīng)單元?
layers?=?[?...?????
????sequenceInputlayer(numFeatures)%輸入層,參數(shù)是輸入特征維數(shù)?????
????lstmlayer(numHiddenUnits)%lsmt層,如果想要構(gòu)建多層lstm修改參數(shù)即可???
????fullyConnectedlayer(numResponses)%全連接層?也就是輸出的維數(shù)????
????regressionlayer];%該參數(shù)說明是在進行回歸問題,而不是分類問題
%指定訓(xùn)練選項。將求解器設(shè)置為?‘a(chǎn)dam‘?并進行?250?輪訓(xùn)練。要防止梯度爆炸,請將梯度閾值設(shè)置為?1。
%指定初始學(xué)習(xí)率?0.005,在?125?輪訓(xùn)練后通過乘以因子?0.2?來降低學(xué)習(xí)率。
options?=?trainingOptions(‘a(chǎn)dam‘?...???
????‘MaxEpochs‘250?...?%這個參數(shù)是最大迭代次數(shù),即進行250次訓(xùn)練,每次訓(xùn)練后更改神經(jīng)網(wǎng)絡(luò)參數(shù)?
????‘GradientThreshold‘1?...%設(shè)置梯度閥值為1?,防止梯度爆炸???
????‘InitialLearnRate‘0.005?...?%設(shè)置初始學(xué)習(xí)率????
????‘LearnRateSchedule‘‘piecewise‘?...???
????‘LearnRateDropPeriod‘125?...?%訓(xùn)練125次后學(xué)習(xí)率下降,衰落因子為0.2?
????‘LearnRateDropFactor‘0.2?...?%訓(xùn)練125次后的學(xué)習(xí)率的衰落因子為0.2??
????‘Verbose‘0?...????
????‘Plots‘‘training-progress‘);?%構(gòu)建曲線圖
%使用?trainNetwork?以指定的訓(xùn)練選項訓(xùn)練?LSTM?網(wǎng)絡(luò)。
net?=?trainNetwork(XTrainYTrainlayersoptions);
%要預(yù)測將來多個時間步的值,請使用?predictAndUpdateState?函數(shù)一次預(yù)測一個時間步,并在每次預(yù)測時更新網(wǎng)絡(luò)狀態(tài)。對于每次預(yù)測,使用前一次預(yù)測作為函數(shù)的輸入。
%使用與訓(xùn)練數(shù)據(jù)相同的參數(shù)來標準化測試數(shù)據(jù)。
dataTestStandardized?=?(dataTest?-?mu)?/?sig;?%歸一化處理,防止數(shù)據(jù)發(fā)散
XTest?=?dataTe
評論
共有 條評論