m行n列の2次元行列​データを入力としたL​STMによる時系列予​測の学習方法について

21 views (last 30 days)
Yuuki
Yuuki on 21 Feb 2020
Commented: Kenta on 23 Feb 2020
LSTMによる時系列予測の入力データについて質問です。
こちらのページをサンプルコードとしMatlabによる時系列予測のプログラミングを練習中なのですが、最終的には5行5列の2次元行列データ(350個)を
入力データとし、その時系列予測を行いたいと考えています。
そこで上記ページのコードをもとに書き換え、一旦テストとして以下のようなコードを実行したところ、
「トレーニング シーケンスの特徴次元は 5 1495 1 ですが、入力層には特徴次元 5 5 1 のシーケンスが必要です。」
とエラーが出ました。
5行5列の行列データを300個横方向につなげ5行1500列の一つのデータセットを作成しXTrainとYTtrainを生成、
その後numFeaturesで[5 5 1]を指定することで5行5列ごとに読み込み学習するというようなイメージでいたためこのようになっています。
これを5行5列の行列データごとに学習するようにするためにはどうすればよいでしょうか?
また、numResponsesは1のままでよいのでしょうか?
至らぬ点は多々あるかと存じますが、ご教示のほどどうぞよろしくお願いいたします。
% read
path = %csv形式で保存された5行5列のデータが保存されているフォルダのパス
D = dir(path); % *.csv
dataset = [];
for k = 1:length(D)
datum = % csvファイルの読み込み
dataset = [dataset, datum]; %横方向に結合
end
%%split dataset
dataTrain = dataset(:,1:1500);
dataTest = dataset(:,1501:1750);
XTrain = dataTrain(:,1:1495);
YTrain = dataTrain(:,6:1500);
numFeatures = [5 5 1];
numResponses = 1;
numHiddenUnits = 200;
layers = [ ...
sequenceInputLayer(numFeatures)
flattenLayer('Name','flatten') % サンプルコードに追加
lstmLayer(numHiddenUnits)
fullyConnectedLayer(numResponses)
regressionLayer];
options = trainingOptions('adam', ...
'MaxEpochs',250, ...
'GradientThreshold',1, ...
'InitialLearnRate',0.005, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',125, ...
'LearnRateDropFactor',0.2, ...
'Verbose',0, ...
'Plots','training-progress');
net = trainNetwork(XTrain,YTrain,layers,options);

Accepted Answer

Kenta
Kenta on 21 Feb 2020
Edited: Kenta on 23 Feb 2020
こんにちは、以下のコードで、5×5の入力から2つの値を返すようになっています。
Yuukiさまのコードで改良すべき点は、XTrainの形をかえることではないかと思います。
例えば、XTrainを300個のセルを持つ、セル配列にして、そのセルの1つ1つに5×5のデータを入れるようにします。
今回は、単に横につなげていらっしゃいますが、numFeaturesを[5 5 1]と設定しても、それではうまく反応しません。
おそらく、dataset=[dataset, datanum]として横につなぐのではなく、
XTrain{i}=datanum;のように、各セルの中に格納していくとうまくいくはずです。
「また、numResponsesは1のままでよいのでしょうか?」に関しては、出力する個数を指定してください。
たとえば、下の例だと、2つの出力を返したいため、numResponse=2とすればよいです。
%%split dataset
% dataTrain = dataset(:,1:1500);
% dataTest = dataset(:,1501:1750);
% XTrain = dataTrain(:,1:1495);
% YTrain = dataTrain(:,6:1500);
XTrain = cell(1,300);
for i=1:300
XTrain{i}=randi(100,[5 5]);
end
YTrain = ones(300,2);
numFeatures = 5;
numResponses = 2;
numHiddenUnits = 200;
layers = [ ...
sequenceInputLayer(numFeatures)
flattenLayer('Name','flatten') % サンプルコードに追加
lstmLayer(numHiddenUnits,'OutputMode','last')
fullyConnectedLayer(numResponses)
regressionLayer];
options = trainingOptions('adam', ...
'MaxEpochs',50, ...
'GradientThreshold',1, ...
'InitialLearnRate',0.005, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',125, ...
'LearnRateDropFactor',0.2, ...
'Verbose',0, ...
'Plots','training-progress');
net = trainNetwork(XTrain,YTrain,layers,options);
XTest=cell(10,1);
for i=1:10
XTest{i}=randi(100,[5 5]);
end
YPred = predict(net,XTest)
  6 Comments
Yuuki
Yuuki on 23 Feb 2020
Kenta 様,
>>関心点の近傍N個分のセンサー×しかるべき時間ステップ分を訓練データ、その中心のセンサーのt+1での値を出力値
アドバイスありがとうございます.
手法の一つとして取り入れさせていただきたいと思います.
改めましてご回答ありがとうございました.
今後も機会がございましたらぜひともよろしくお願い致します.
Kenta
Kenta on 23 Feb 2020
失礼いたしました。はじめの回答、いくつか間違いがありました。コードのほう、訂正していますので今後も使う機会があればご注意ください。
また、何かございましたらいつでも聞いてください。よろしくお願いいたします。
YTrain = ones(300,2);
numFeatures = 5;
lstmLayer(numHiddenUnits,'OutputMode','last')

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!