Обучить многофакторную регрессионную задачу из нескольких серий с помощью LSTM с сохранением состояния в Керасе - PullRequest
4 голосов
/ 23 апреля 2019

У меня есть временной ряд 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 эпох выглядит так: loss_25epochs

1 Ответ

4 голосов
/ 01 мая 2019

Обычно, когда результаты совпадают, это потому, что ваши данные не нормализованы. Я предлагаю вам центрировать ваши данные со средним значением = 0 и стандартным значением = 1 с помощью простого нормального преобразования (т. Е. (Данные - среднее) / стандартное преобразование). Попробуйте переделать это перед тренировкой и тестированием. Различия в нормализации данных между обучающими и тестовыми наборами также могут вызвать проблемы, которые могут быть причиной вашего несоответствия в потере поезда и теста. Всегда используйте один и тот же метод нормализации для всех ваших данных.

...