Почему Adam.iterations всегда установлен в 0 в Керасе? - PullRequest
2 голосов
/ 02 июля 2019

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

Однако это не так. Мои точности начинают сильно колебаться после того, как я загружаю модель, и мне нужно некоторое время, чтобы фактически вернуться к моей предыдущей точности:

Первый запуск

enter image description here

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

enter image description here

Перебрав различные темы с возможными объяснениями (ни одна из них не была применима к моим выводам), я думаю, что выяснил причину:

Я использую 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 (бэкэнд-тензор потока)? )

1 Ответ

0 голосов
/ 02 июля 2019

Значение iterations восстанавливается, как видно из фрагмента кода ниже.

model.save('dense_adam_keras.h5')
mdl = load_model('dense_adam_keras.h5')

print('iterations is ', K.get_session().run(mdl.optimizer.iterations))

iterations is  46

Когда вызывается 'load_model', вызывается метод deserialize для создания объекта оптимизатора, а затем вызывается метод set_weights для восстановления состояния оптимизатора из сохраненных весов.

https://github.com/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/optimizers.py#L742

https://github.com/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/optimizers.py#L103

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/optimizers.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...