Keras - Восстановить скрытое состояние LSTM для определенной отметки времени - PullRequest
0 голосов
/ 24 февраля 2019

Продолжается этот вопрос ( LSTM - Создание прогнозов для частичной последовательности ).Как описано в предыдущем вопросе, я обучил модель с сохранением состояния LSTM для бинарной классификации с партиями из 100 образцов / меток, например:

[Feature 1,Feature 2, .... ,Feature 3][Label 1]
[Feature 1,Feature 2, .... ,Feature 3][Label 2]
...
[Feature 1,Feature 2, .... ,Feature 3][Label 100]

Код модели:

def build_model(num_samples, num_features, is_training):
    model = Sequential()
    opt = optimizers.Adam(lr=0.0005, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0001)

    batch_size = None if is_training else 1
    stateful = False if is_training else True
    first_lstm = LSTM(32, batch_input_shape=(batch_size, num_samples, num_features),  return_sequences=True,
                      activation='tanh', stateful=stateful)

    model.add(first_lstm)
    model.add(LeakyReLU())
    model.add(Dropout(0.2))
    model.add(LSTM(16, return_sequences=True, activation='tanh', stateful=stateful))
    model.add(Dropout(0.2))
    model.add(LeakyReLU())
    model.add(LSTM(8, return_sequences=True, activation='tanh', stateful=stateful))
    model.add(LeakyReLU())
    model.add(Dense(1, activation='sigmoid'))

    if is_training:
        model.compile(loss='binary_crossentropy', optimizer=opt,
                      metrics=['accuracy', f1])
    return model

При прогнозировании, модель не имеет состояния , размер партии равен 1, а вероятность классификации определяется после каждой выборки следующим образом:

[Feature 1,Feature 2, .... ,Feature 10][Label 1] -> (model) -> probability

вызовmodel.reset_states() после того, как модель закончила обработку партии из 100 образцов.Модель работает, и результаты великолепны.

Примечание. Мои данные - это события, поступающие из из нескольких источников .


Моя проблема:

Когда я проверяю свою модель, я контролирую порядок образцов и могу убедиться, что образцы поступают с одного и того же образца.источник.т. е. все первые 100 выборок получены из источника 1, затем после вызова model.reset_states() следующие 100 выборок получены из источника 2 и т. д.

Однако в моей производственной среде выборки поступают, например, асинхронно:

Первые 3 образца из источника 1, затем 2 образца из источника 2 и т. Д.

Иллюстрационная:

enter image description here


Мой вопрос:

Как я могу сериализовать состояние модели в определенное время для каждого источника, чтобы я мог сохранить его после каждого образца и затем загрузить егоназад, когда новый образец прибывает из того же источника.

1 Ответ

0 голосов
/ 24 февраля 2019

Вы можете получить и установить внутренние состояния следующим образом:

import keras.backend as K

def get_states(model):
    return [K.get_value(s) for s,_ in model.state_updates]

def set_states(model, states):
    for (d,_), s in zip(model.state_updates, states):
        K.set_value(d, s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...