LSTMのコード作成について

6 views (last 30 days)
孝太郎 泉
孝太郎 泉 on 15 Oct 2020
Commented: 孝太郎 泉 on 22 Oct 2020
 LSTMについて質問です。
 Sequence to Sequence 回帰用のLSTMネットワークに学習をさせて、新しいデータを予測させたいのですが、途中から方法が分からず躓いてしまいました。
以下のURLであるMathWorksさんのコードを参考にさせていただきました。
  1. https://jp.mathworks.com/help/deeplearning/ref/nnet.cnn.layer.lstmlayer.html;jsessionid=5fd322f8904fc8c4b63b39c4c8ec#d122e24388 (例;回帰用のLSTMネットワーク)
  2. https://jp.mathworks.com/help/deeplearning/ug/sequence-to-sequence-regression-using-deep-learning.html (深層学習を使用した sequence-to-sequence 回帰)
  • したいこと
入力データに過去1年半分の振り分け番号、曜日、時刻、気温、日射量、降水量、風速、在室人員スケジュール(標準化済み)を与え、再学習時の出力時に室内のOA、照明負荷を出したい。
  • 躓いている箇所
 参考にしているコードの補助関数をそのまま流用しては私が求めたい負荷が出せなく、知識不足のためここから進めない。
  • 流れ
 現在私は学習データとして、過去1年間分の振り分け番号、曜日、時刻、気温、日射量、降水量、風速、在室人員スケジュール(標準化済み)を与えて、例題通りの隠れユニットが 200 個ある LSTM 層と、その後に続くサイズが 50 の全結合層とドロップアウトの確率が 0.5 のドロップアウト層で構成された LSTM ネットワークを作成しました。またオプションとしてソルバー 'adam' を使用して、サイズ 20 のミニバッチで 60 エポックの学習を行い、学習率を 0.01 に指定しネットワークの学習を行いました。ここまでは上手くいったのですが、次からのネットワークのテストが上手くいきませんでした。
 補助関数として用いられている関数processTurboFanDataTestが上記にも記載している通り、私が求めたい負荷をそのまま出すことが出来ず、コードの組立も分からないため苦戦しています。
 そのため、補助関数processTurboFanDataTest内の改善方法を教えていただきたいです。また私は過去1年半のデータ(入力;振り分け番号、曜日、時刻、気温、日射量、降水量、風速、在室人員スケジュール 出力;OA or Light負荷)を用い、1週間のデータ(入力、出力ともに1年半データと同様項)を求めたいのですが、そもそもLSTMでは求めることが出来るのでしょうか?もしできない場合変わりになる手法などあるのでしょうか?
 宜しくお願い致します。
参考コード
LSTM_Seq2 = 回帰用LSTMネットワーク
NetWorkTest = LSTM_Seq2を用いて新しく予測したコード
LSTMData_3 = .zipファイルに学習に必要なデータが格納させている
Data_3 = .zipファイルを展開した際に保存されるファイル名
processTurboFanDataTest, processTurboFanDataTrain - = 例題で用いられた補助関数
TrainData, TestData = ①を参考にして作成した補助関数
  2 Comments
Hiro Yoshino
Hiro Yoshino on 20 Oct 2020
躓いているのは「外部因数を使う」ところかなと思いました。
合っていますか?
孝太郎 泉
孝太郎 泉 on 22 Oct 2020
質問ありがとうございます。MATLAB自体初心者のため誤った表現等をしている可能性があるため予めご了承下さい。
躓いていた箇所は補助関数processTuboFanDataSet 内の太字で表されている部分で、
for i = 1:numObservations
X = predictors{i};
sequenceLength = size(X,2);
rul = RULTest(i);
responses{i} = rul+sequenceLength-1:-1:rul;
end
ここが、私が予測したい対象である照明負荷又はOA負荷にそのまま流用できないのでは?という点でした。またこちらの補助関数を用いる例題ではあらかじめ出力データ[YTest]を既知値として扱っている(?)とも感じたため流用出来ないと考えので質問させていただきました。
そのため、元データであるNetWorkTest.mを書き換え、以下のように行いました(学習などに用いたデータは同じです)。この方法だと上手く実行自体はできたのですが、新たな疑問が生まれました。それがデータの取り扱い方です。
私は時系列データ(2012.4~2013.11)を学習させ、その期間中である一部データをあらかじめ学習データから外しテストデータとして用いる(テストデータ期間;2012.8.4~2012.8.10)ようにし、実測値と予測値の精度比較を行っているのですが、例題としたLSTMの説明や他の文章でも過去のデータを学習させ未来のデータ(時系列データ)を扱っているものばかりでした。私がいま行っている方法でも果たして十分な精度比較が行えるのでしょうか?それともテストデータとしては、やはり学習データより未来のデータを入力した方が良いのでしょうか?
よろしくお願いします。
以下書き直したコードです。
LSTM_Seq2_2.mlx = 前回のLSTM_Seq2の書き直しです
NetWorkTest_2.mlx = 前回のNetWorkTestの書き直しです
入力データ等は前回と同じです

Sign in to comment.

Answers (0)

Categories

Find more on Deep Learning Toolbox in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!