Keras – Restaura el estado oculto de LSTM para una marca de tiempo específica

Esta pregunta está en continuar con ( LSTM – Hacer predicciones en una secuencia parcial ). Como se describió en la pregunta anterior, he entrenado un modelo LSTM con estado para la clasificación binaria con lotes de 100 muestras / tags, así:

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

Código del modelo:

 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 

Al predecir, el modelo no tiene estado , el tamaño del lote es 1 y la probabilidad de clasificación se recupera después de cada muestra, de este modo:

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

llamando a model.reset_states() después de que el modelo terminó de procesar un lote de 100 muestras. El modelo funciona y los resultados son excelentes.

Nota: Mis datos son eventos que provienen de múltiples fonts .


Mi problema:

Cuando pruebo mi modelo, tengo control sobre el orden de las muestras y puedo asegurarme de que las muestras provengan de la misma fuente. es decir, todas las primeras 100 muestras son de la fuente 1, luego, después de llamar a model.reset_states() las siguientes 100 muestras son de la fuente 2 y así sucesivamente.

En mi entorno de producción, sin embargo, las muestras llegan de forma asíncrona, por ejemplo:

Primeras 3 muestras de la fuente 1 luego 2 muestras de la fuente 2, etc.

Ilustracion

introduzca la descripción de la imagen aquí


Mi pregunta:

¿Cómo puedo serializar el estado del modelo en una determinada marca de tiempo para cada fuente, para poder guardarlo después de cada muestra y luego volver a cargar cuando una nueva muestra llega de la misma fuente?

Puedes obtener y establecer los estados internos así:

 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)