回帰目的で LSTM を含む Keras で反復モデルをトレーニングしようとしています。モデルをオンラインで使用したいのですが、私が理解している限り、ステートフルな LSTM をトレーニングする必要があります。モデルは一連の値を出力する必要があるため、期待される出力ベクトルのそれぞれについて損失を計算できることを願っています。ただし、私のコードがこのように機能していないのではないかと心配しており、誰かが私が正しいことをしているかどうか、またはより良いアプローチがあるかどうかを理解するのを手伝ってくれれば幸いです.
モデルへの入力は、128 次元のベクトルのシーケンスです。トレーニング セット内の各シーケンスの長さは異なります。毎回、モデルは 3 要素のベクトルを出力する必要があります。
2 つのモデルをトレーニングして比較しようとしています。A) 128 の入力と 3 つの出力を持つ単純な LSTM。B) 128 の入力と 100 の出力を持つ単純な LSTM + 3 つの出力を持つ密な層。
モデル A) の場合、次のコードを書きました。
# Model
model = Sequential()
model.add(LSTM(3, batch_input_shape=(1, None, 128), return_sequences=True, activation = "linear", stateful = True))`
model.compile(loss='mean_squared_error', optimizer=Adam())
# Training
for i in range(n_epoch):
for j in np.random.permutation(n_sequences):
X = data[j] # j-th sequences
X = X[np.newaxis, ...] # X has size 1 x NTimes x 128
Y = dataY[j] # Y has size NTimes x 3
history = model.fit(X, Y, epochs=1, batch_size=1, verbose=0, shuffle=False)
model.reset_states()
このコードでは、出力シーケンスがトレーニング セットのグラウンド トゥルース シーケンスに近づくため、モデル A) は正常にトレーニングされているように見えます。しかし、すべての NTimes 出力ベクトルを考慮して損失が本当に計算されているのだろうか。
モデル B) の場合、レイヤーが密集しているため、出力シーケンス全体を取得する方法が見つかりませんでした。したがって、私は書いた:
# Model
model = Sequential()
model.add(LSTM(100, batch_input_shape=(1, None, 128), , stateful = True))
model.add(Dense(3, activation="linear"))
model.compile(loss='mean_squared_error', optimizer=Adam())
# Training
for i in range(n_epoch):
for j in np.random.permutation(n_sequences):
X = data[j] #j-th sequence
X = X[np.newaxis, ...] # X has size 1 x NTimes x 128
Y = dataY[j] # Y has size NTimes x 3
for h in range(X.shape[1]):
x = X[0,h,:]
x = x[np.newaxis, np.newaxis, ...] # h-th vector in j-th sequence
y = Y[h,:]
y = y[np.newaxis, ...]
loss += model.train_on_batch(x,y)
model.reset_states() #After the end of the sequence
このコードでは、モデル B) は正常にトレーニングされません。トレーニングが収束せず、損失値が周期的に増減するように思えます。また、最後のベクトルのみを Y として使用し、トレーニング シーケンス全体 X でフィット関数を呼び出してみましたが、改善はありませんでした。
何か案が?ありがとうございました!