В настоящее время я пытаюсь войти в построение нейронной сети через keras / тензор потока и прорабатывать некоторые примеры проблем. На данный момент я пытаюсь понять, как правильно сохранить и загрузить мою текущую модель с помощью model.save () /. Load (). Я ожидаю, что, если все будет настроено правильно, загрузка предварительно обученной модели и продолжение обучения не должны испортить мою предыдущую точность и просто продолжить именно там, где я остановился.
Однако это не так. Мои точности начинают сильно колебаться после того, как я загружаю модель, и мне нужно некоторое время, чтобы фактически вернуться к моей предыдущей точности:
Первый запуск

Продолжение выполнения

Перебрав различные темы с возможными объяснениями (ни одна из них не была применима к моим выводам), я думаю, что выяснил причину:
Я использую tf.keras.optimizers.Adam для оптимизации веса и после проверки его инициализатора
def __init__(self, [...], **kwargs):
super(Adam, self).__init__(**kwargs)
with K.name_scope(self.__class__.__name__):
self.iterations = K.variable(0, dtype='int64', name='iterations')
[...]
def get_config(self):
config = {
'lr': float(K.get_value(self.lr)),
'beta_1': float(K.get_value(self.beta_1)),
'beta_2': float(K.get_value(self.beta_2)),
'decay': float(K.get_value(self.decay)),
'epsilon': self.epsilon,
'amsgrad': self.amsgrad
}
создается впечатление, что счетчик «итераций» всегда сбрасывается в 0, и его текущее значение не сохраняется и не загружается, когда вся модель сохраняется как не являющаяся частью конфигурации. Кажется, это противоречит утверждению, что model.save сохраняет «состояние оптимизатора, позволяя возобновить обучение именно с того места, где вы остановились». (https://keras.io/getting-started/faq/)., поскольку счетчик итераций - это тот, который управляет экспоненциальным «выпадением» скорости обучения в алгоритме Адама
1. / (1. + self.decay * math_ops.cast(self.iterations,
K.dtype(self.decay))))
моя модель всегда перезапускается с начальной «большой» скоростью обучения, , даже если я установил параметр «initial_epoch» в model.fit () для фактического номера эпохи, где была сохранена моя модель (см. Изображения, загруженные выше ).
Итак, мои вопросы:
- Это предполагаемое поведение?
- Если это так, как это согласуется с цитируемым утверждением из FAQ по keras о том, что model.save () «возобновляет обучение именно с того места, где вы остановились»?
- Есть ли способ на самом деле сохранить и восстановить оптимизатор Адама , включая счетчик итераций без написания моего собственного оптимизатора (я уже обнаружил, что это возможное решение, но мне было интересно если действительно нет более простого метода)
Редактировать
Я нашел причину / решение: я вызвал model.compile после load_model, и это сбрасывает оптимизатор, сохраняя при этом весовые коэффициенты (см. Также Неужели model.compile () инициализирует все весовые коэффициенты и смещения в Keras (бэкэнд-тензор потока)? )