LSTMに関するモデル生成については、以下の記事でわかりやすく書いてあります。
参考記事:初心者のRNN(LSTM) | Kerasで試してみる
この記事では、各コードについて以下のように説明されています。
# モデル構築
# 1つの学習データのStep数(今回は25)
length_of_sequence = g.shape[1]
in_out_neurons = 1
n_hidden = 300
model = Sequential()
model.add(LSTM(n_hidden, batch_input_shape=(None, length_of_sequence, in_out_neurons), return_sequences=False))
model.add(Dense(in_out_neurons))
model.add(Activation("linear"))
optimizer = Adam(lr=0.001)
model.compile(loss="mean_squared_error", optimizer=optimizer)
・n_hidden: 隠れ層 -> 数が多い程,学習モデルの複雑さが増加
・batch_input_shape: LSTMに入力するデータの形を指定([バッチサイズ,step数,特徴の次元数]を指定する)
・Denseでニューロンの数を調節しているだけ.今回は,時間tにおけるsin波のy軸の値が出力なので,ノード数1にする.
・線形の活性化関数を用いている.
・compileで,誤差関数:最小2乗誤差,最適化手法: Adamを用いるように定義
今回の質問にあるコードで考えると、以下のように解釈できます。
model = Sequential()
#隠れ層(LTSMブロック数)4,入力ユニット数testX.shape[1]のLSTMブロックを作成
model.add(LSTM(4, input_shape=(testX.shape[1], look_back)))
#出力ユニットが1になるよう調整
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=1000, batch_size=1, verbose=2)
結論、質問に対する答えは次のようになります。
・隠れ層の数…5つ(LSTM4層+Dense1層)
・入力層のユニット数…testX.shape[1]の値
・出力層のユニット数…1つ
・隠れ層のLSTMブロック数…4つ
また、隠れ層の追加については、以下のようにLSTM関数の第1引数を調整することで行なえます。
#model.add(LSTM(4, input_shape=(testX.shape[1], look_back)))
model.add(LSTM(100, input_shape=(testX.shape[1], look_back)))
実際、LSTM関数の第1引数を4から100に変えて実行したところ、RMSEの低下(誤差の低減)が見られました。ただし、4から40に変えたときはRMSEが大きく低下しましたが、40から100に変えたときはそれほどRMSEが変化していません(すなわち学習率の頭打ち)。
闇雲に隠れ層の数を増やせばよいというわけでもないようです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/07 20:48