複数の入力データを用いたLSTMによる学習と,予測テストのための入力データの形について
Show older comments
LSTMを用いた時系列データの学習と予測について質問です.
学習モデルを構築したあとの,predict関数による予測とその出力に問題が発生しており,解決策が思いつかないため質問を設けさせていただきました.
学習の概要は以下の通りです.
・ 学習のための入力データA,B,Cはそれぞれ5×200 double型の行列データであり,それぞれの1列は1タイムステップに相当する.
・ A,B,Cを入力データとして学習させたいため,trainNetworkに入力する際は3×1 cellのデータを作成し入力する.(各cellにはA,B,Cのデータが入っている)
・ tを入力しt+1を出力するように学習を行う.
以上の内容を実際に書いたものが以下になります.
% Load data
XTrain_A = Data_A(:,1:end-1);
YTrain_A = Data_A(:,2:end);
XTrain_B = Data_B(:,1:end-1);
YTrain_B = Data_B(:,2:end);
XTrain_C = Data_C(:,1:end-1);
YTrain_C = Data_C(:,2:end);
% Prepare for input dataset
XTrain = {XTrain_A;XTrain_B;XTrain_C};
YTrain = {YTrain_A;YTrain_B;YTrain_C};
% Layers and options
numFeatures = 5;
numResponses = 5;
numHiddenUnits = 100;
layers = [ ...
sequenceInputLayer(numFeatures)
flattenLayer('Name','flatten')
lstmLayer(numHiddenUnits,'OutputMode','sequence')
fullyConnectedLayer(numResponses)
regressionLayer];
options = trainingOptions('sgdm', ...
'MaxEpochs',200, ...
'GradientThreshold',1, ...
'InitialLearnRate',0.005, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',100, ...
'LearnRateDropFactor',0.3, ...
'Verbose',0, ...
'Plots','training-progress');
% Machine learning
net = trainNetwork(XTrain,YTrain,layers,options);
ここで作成した学習モデルを評価するため,A,B,Cと同様の形のDというデータセットとpredict関数を用い以下のように予測を行ったところ,局所解に陥ったような結果(同じ一定の値を最後まで出力し続ける)になりました.
予測のためのデータセットはDのみであるため,入力の形はcellではなく5×200 doubleそのままになっています.
% Load data
Test_D = Data_A(:,1:end-1);
for i = 1:199;
Pred_D(:,i+1) = predict(net,Test_D(:,i),'ExecutionEnvironment','cpu');
end
これは入力データや学習の仕方もしくは予測を行う際の入力の仕方でなにか間違えてしまっているのでしょうか.
(A,B,C,Dのそれぞれは時間経過による値の変化率に差はあるものの,定性的には似たような変化を示すデータとなっています)
長くなりましたが,ミスしている箇所や解決策がわからず途方に暮れてしまっているため,些細なことでも構いませんのでご指摘いただければ幸いです.
3 Comments
こんにちは、何らかの方法を使って、データを共有していただくことは可能ですか?もちろん今のままでも何らかの手掛かりは探せそうですが、それがあったほうが効率がよさそうです。ご検討宜しくお願い致します。
ざっとみたところ、コード自体は動いているようですし、全体的には正しく動いていそうでした。
ただ、訓練の方はLSTMでやっていて、推論のほうは、tからt+1(1~tからt+1ではなく)を予測していて、そこが問題になっている気がします。訓練のほうでは、各列の値をインプットして、それをどんどん累積させる形で訓練していきますが、推論のほうは、1つ前のステップのみから予測しているので、実行している内容は異なっていると思います。predict and updateの形で、進めていくとうまくいくかもしれませんが、それはもうお試しになりましたか?
あとは、意図したとおりにXとYのペアが作れていなかったり、思わぬ勘違いがあったりするのかなと思いましたが、ここからではなかなか同定するのは難しそうです。
Kenta
on 10 May 2020
こんにちは、丁寧に教えていただきありがとうございます。回答のほうもご覧ください。コードもありがとうございます。
1)について、3通りの方法を詳しく教えていただきありがとうございます。私は、3.の方法が適していると思います。すでにご覧になっていると思いますが、こちら の例もすでにご覧になっているとは思いますが、例えば、100個のデータセットがあって、それぞれの実験で、19個のセンサー、280のタイムステップがあると、100個のセルのうちの1つに19*280のdouble型の変数が格納されています。
2)について、丁寧にありがとうございます。いただいたコードでは、2の方法でうまくいったので、こちらで解決できないかと願っています...
3)について、こちらもありがとうございます。1)の1.と3.はデータの組が1つのときは同じことを言っていると思います。こちらで両方試しましたが結果は同じになりました。
予測に関しては、添付いただいたコードの方では、t-1のデータ(例えばセンサーデータ5つ分)からtのデータを予測しています。例えば、データの形状がy=sinxのような形だと、t-1の値が0.5でも、そこでの微分値がないとtの値はわかりませんね。それと同じ理由で、LSTMのように時系列データ用の関数に読み込ませないと履歴を蓄積できないのでうまく予測できない、ということなのではないでしょうか?(たぶん、勘違いしていたらすいません...)
補足もありがとうございます。
実装は回答に貼り付けたのですが、これでいかがでしょうか?
Accepted Answer
More Answers (0)
Categories
Find more on Deep Learning Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
