У меня есть временной ряд P
процессов, каждый из которых имеет различную длину, но все имеют 5 переменных (измерений). Я пытаюсь предсказать предполагаемое время жизни процесса тестирования. Я подхожу к этой проблеме с состоянием LSTM
в Керасе. Но я не уверен, что мой тренировочный процесс правильный.
Я делю каждую последовательность на партии длиной 30
. Таким образом, каждая последовательность имеет форму (s_i, 30, 5)
, где s_i
отличается для каждой из P
последовательностей (s_i = len(P_i)//30
). Я добавляю все последовательности в свои тренировочные данные, которые имеют форму (N, 30, 5)
, где N = s_1 + s_2 + ... + s_p
.
Модель:
# design network
model = Sequential()
model.add(LSTM(32, batch_input_shape=(1, train_X[0].shape[1], train_X[0].shape[2]), stateful=True, return_sequences=True))
model.add(LSTM(16, return_sequences=False))
model.add(Dense(1, activation="linear"))
model.compile(loss='mse', optimizer=Adam(lr=0.0005), metrics=['mse'])
model.summary()
выглядит как
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_1 (LSTM) (1, 30, 32) 4864
_________________________________________________________________
lstm_2 (LSTM) (1, 16) 3136
_________________________________________________________________
dense_1 (Dense) (1, 1) 17
=================================================================
Тренировочные петли:
for epoch in range(epochs):
mean_tr_acc = []
mean_tr_loss = []
for seq in range(train_X.shape[0]): #24
# train on whole sequence batch by batch
for batch in range(train_X[seq].shape[0]): #68
b_loss, b_acc = model.train_on_batch(np.expand_dims(train_X[seq][batch], axis=0), train_Y[seq][batch][-1])
mean_tr_acc.append(b_acc)
mean_tr_loss.append(b_loss)
#reset lstm internal states after training of each complete sequence
model.reset_states()
Edit:
Проблема с графиком потерь заключалась в том, что я делил значения в своей пользовательской потере, делая их слишком маленькими. Если я уберу деление и построю график потерь логарифмически, он выглядит хорошо.
Новая проблема:
Как только обучение закончено, я пытаюсь предсказать. Я показываю своей модели 30 временных образцов нового процесса; поэтому форма ввода такая же, как у batch_input_shape
во время тренировки, т.е. (1, 30, 5)
. Прогноз, который я получаю для разных партий одной и той же последовательности, одинаков.
Я почти уверен, что делаю что-то не так в тренировочном процессе. Если бы кто-нибудь мог мне помочь, был бы благодарен. Спасибо.
Редактировать 2:
Таким образом, модель предсказывает точно такие же результаты, только если она обучалась более 20 эпох. В противном случае значения прогноза очень близки, но все же немного отличаются. Я думаю, это из-за какого-то переоснащения. Помогите !!!
Потеря за 25 эпох выглядит так: