Предсказания с произвольной длиной последовательности для состоящей RNN (LSTM/GRU) в Keras

Вопрос или проблема

У меня есть данные временных рядов со следующими свойствами:

входная форма:  (количество_шагов, количество_признаков)
выходная форма: (количество_шагов, количество_выходов)

Я изменяю форму данных на батч:

входная форма:  (количество_батчей, количество_шагов_в_батче, количество признаков)
выходная форма: (количество_батчей, количество_шагов_в_батче, количество выходов)

У меня есть состояние RNN в Keras:

modelinput = Input(batch_shape=(количество_батчей, None, количество признаков))
prediction = GRU(10, return_sequences=True, stateful=True)(inputs)
model = Model(inputs=modelinput, outputs=prediction)

После обучения (которое работает нормально) я хотел бы прогнозировать на последовательности без разрезания данных, так что входная форма (количество_шагов, количество_признаков). Как я могу это сделать?

Я думал о том, чтобы иметь вторую модель, которая делит веса с RNN и имеет динамические размеры входов. Это возможно?

Я нашел возможное решение: вы можете сохранить веса, создать совершенно новую модель и снова загрузить веса.

Оригинальная Stateful Модель

modelinput = Input(batch_shape=(количество_батчей, None, количество признаков))
prediction = GRU(10, return_sequences=True, stateful=True)(inputs)
model = Model(inputs=modelinput, outputs=prediction)

Сохранить Веса после Обучения

model.fit(...)
model.save_weights('weights.h5')

Создать Новую Модель (такая же структура, просто не состоящая и с динамическим размером батча)

modelinput_pred = Input(batch_shape=(None, None, количество признаков))
prediction_pred = GRU(10, return_sequences=True, stateful=False)(inputs_pred)
model_pred = Model(inputs=modelinput_pred, outputs=prediction_pred)

Загрузить Сохраненные Параметры и Прогнозировать

model_pred.load_weights('weights.h5')
model_pred.predict(...)

Тем не менее, я надеюсь на лучшее решение через совместное использование весов между состоянии GRU и стандартным GRU. Это возможно?

Ответ или решение

Предсказания с произвольной длиной последовательностей для состоящей RNN (LSTM/GRU) в Keras — это распространенная задача при работе с временными рядами. В данной ситуации вы хотите использовать стейтфул GRU для обучения и затем использовать его для прогнозирования на данных с произвольной длиной входа. В вашей схемы, упомянутой в вопросе, мы видим шаги, которые вы уже предприняли для решения проблемы, однако я предложу расширенный и оптимальный подход.

1. Подготовка данных

Прежде всего, убедитесь, что ваши данные правильно структурированы для обучения с использованием батч-формы, которая необходима для стейтфул RNN.

Ваши исходные данные должны быть преобразованы в форму:

input_shape = (num_batches, num_timesteps_in_batch, num_features)
output_shape = (num_batches, num_timesteps_in_batch, num_outputs)

2. Создание стейтфул GRU модели

Создайте стейтфул GRU модель с фиксированным размером батча. Пример кода:

from keras.models import Model
from keras.layers import Input, GRU

num_batches = 32  # Пример значения, замените на ваше
num_timesteps = None  # мы указываем None, так как это стейтфул GRU
num_features = 10  # Например, количество признаков
num_outputs = 1  # Например, количество выходов

inputs = Input(batch_shape=(num_batches, None, num_features))
predictions = GRU(10, return_sequences=True, stateful=True)(inputs)
model = Model(inputs=inputs, outputs=predictions)

3. Обучение модели

Обучите вашу модель, используя model.fit(...). Пример:

model.fit(X_train, y_train, batch_size=num_batches, epochs=50)

4. Сохранение весов

После завершения тренировки сохраните веса модели:

model.save_weights('weights.h5')

5. Создание новой модели для предсказания

Создайте новую модель, которая будет использовать ту же архитектуру, но не будет являться стейтфул:

inputs_pred = Input(shape=(None, num_features))
predictions_pred = GRU(10, return_sequences=True, stateful=False)(inputs_pred)
model_pred = Model(inputs=inputs_pred, outputs=predictions_pred)

# Загрузите веса
model_pred.load_weights('weights.h5')

6. Выполнение предсказаний

Теперь вы можете использовать вашу не стейтфул модель для предсказания:

predictions = model_pred.predict(X_new)

7. Использование общей модели (опционально)

Как вы упомянули, ваша идея о совместном использовании весов между стейтфул GRU и стандартным GRU не совсем возможна из-за различий в обработке состояний между этими двумя архитектурами. Однако, как было описано, использование подхода со сменой моделей и загрузкой весов — оптимальный способ.

Если вы хотите избежать создания новой модели, вы можете воспользоваться следующими стратегиями:

  • Использовать функции Keras для сериализации и десериализации модели (например, использовать model.save() и keras.models.load_model(), но в этом случае, вам надо будет убрать свойство stateful при загрузке модели).
  • Создать пользовательский слой, который бы объединял функциональность стейтфул GRU и стандартного GRU, но это усложнит вашу архитектуру.

Заключение

Предсказания с произвольной длиной последовательностей для состоящих RNN в Keras можно эффективно реализовать, используя предложенный подход. Этот метод гарантирует, что вы можете использовать созданную вами модель с фиксированным разведением на тренировочных данных и далее получать предсказания без необходимости нарезки или изменения длины последовательности входных данных.

Оцените материал
Добавить комментарий

Капча загружается...