Вопрос или проблема
У меня есть данные временных рядов со следующими свойствами:
входная форма: (количество_шагов, количество_признаков)
выходная форма: (количество_шагов, количество_выходов)
Я изменяю форму данных на батч:
входная форма: (количество_батчей, количество_шагов_в_батче, количество признаков)
выходная форма: (количество_батчей, количество_шагов_в_батче, количество выходов)
У меня есть состояние 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 можно эффективно реализовать, используя предложенный подход. Этот метод гарантирует, что вы можете использовать созданную вами модель с фиксированным разведением на тренировочных данных и далее получать предсказания без необходимости нарезки или изменения длины последовательности входных данных.