m行n列の2次元行列データを入力としたLSTMによる時系列予測の学習方法について
21 views (last 30 days)
Show older comments
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);
0 Comments
Accepted Answer
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
Kenta
on 23 Feb 2020
失礼いたしました。はじめの回答、いくつか間違いがありました。コードのほう、訂正していますので今後も使う機会があればご注意ください。
また、何かございましたらいつでも聞いてください。よろしくお願いいたします。
YTrain = ones(300,2);
numFeatures = 5;
lstmLayer(numHiddenUnits,'OutputMode','last')
More Answers (0)
See Also
Categories
Find more on データ分布プロット in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!