MATLAB Answers

0

深層学習を使った時系​列予測をする際のtr​ainNetwork​関数での取り扱い

Asked by Naoto Iwaki on 7 Oct 2019
Latest activity Edited by Kazuya
on 10 Oct 2019
現在深層学習を使用した時系列データ予測のうちシーケンスデータの読み込みからネットワークの学習プロセスまでを行っています。そこで下記プログラムを作成して実行したところ、trainNetwork関数のところで「無効な学習データです。予測子はシーケンスの N 1 列の cell 配列でなければなりません。ここで N はシーケンスの数です。すべてのシーケンスは同じ特徴次元と、少なくとも 1 つのタイム ステップをもたなければなりません。」と表示されました。次に、1行ずつデバッグしたところN1列のcell配列を予測子を作りlstm層などの作成までは確認できました。そこでエラーメッセージ後半の文章のほうが問題になっていると思っています。しかし、修正方法がわかりません。
ちなみに以下のプログラムは「深層学習を使用した時系列予測」などを参照にして作りました。
以下プログラム
T1=readtable('pressure_data_20190326_1.xlsx');
%T1:エクセルデータ(添付)の読み込み
%table2arraytable型配列を変更
%lambda=1.0 pressure data
T1_data=table2array(T1(4:end,2:end));
%1N列の配列へ
for i=1:300
T1_array{i}=T1_data(1:end,i);
end
%転置
T1_a=(T1_array)';
%シーケンスの最初の90%で学習を行い残りの10%でテストする
numTimeStepsTrain = floor(0.9*numel(T1_a));
T1Train = T1_a(1:numTimeStepsTrain+1);
T1Test = T1_a(numTimeStepsTrain+1:end);
%予測子と応答の準備
XT1Train = T1Train(1:end-1);
YT1Train = T1Train(2:end);
%lstmアーキテクチャ 定義
numFeatures=1;
numResponse=1;
numHiddenUnits=200;
%lstm層
layers = [ ...
sequenceInputLayer(numFeatures)
lstmLayer(200)
fullyConnectedLayer(numResponse)
regressionLayer];
%トレーニングオプション
options = trainingOptions('adam', ...
'MaxEpochs',250, ...
'GradientThreshold',1, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',125, ...
'LearnRateDropFactor',0.2, ...
'Verbose',0, ...
'Plots','training-progress')
net = trainNetwork(XT1Train,YT1Train,layers,options);
出力結果:
エラー: trainNetwork (line □□)
無効な学習データです。予測子はシーケンスの N 1 列の cell 配列でなければなりません。ここで N はシーケンスの数です。すべてのシーケンスは同じ
特徴次元と、少なくとも 1 つのタイム ステップをもたなければなりません。
エラー: LSTM (line □□)
net = trainNetwork(XT1Train,YT1Train,layers,options);

  0 Comments

Sign in to comment.

1 Answer

Kazuya
回答者: Kazuya
2019 年 10 月 8 日
 採用された回答

原因は XT1Train の各セルの中身がセル配列になっていることの様です。各セルの中身が例えば double 型であれば動くはず。
冒頭を以下のように変えて試してみてください。数値部分だけを readtable で読み込む設定にしました。
opts = detectImportOptions(filename,'DataRange','B4');
T1=readtable('pressure_data_20190326_1.xlsx',opts,'ReadVariableNames',false);
T1_data = T1.Variables;
%1行N列の配列へ
for i=1:300
T1_array{i}=T1_data(1:end,i)';
end

  2 Comments

Naoto Iwaki 2019 年 10 月 8 日
ありがとうございます。変更するとtr​ainNetwork関数に通りました。
Kazuya
2019 年 10 月 8 日
良かったです。データ、コードと用意いただいていたので回答しやすかったです。
ありがとうございます!

Sign in to comment.