Каково поведение при возобновлении обучения при использовании снижения скорости обучения в TensorFlow / Keras?

Мне трудно понять, как будет возобновлено обучение при загрузке модели с диска при использовании планировщика, подобного приведенному ниже.

learning_rate_scheduler = tensorflow.keras.optimizers.schedules.ExponentialDecay(
0.01, 
decay_steps=1000, 
decay_rate=0.96, 
staircase=True)

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

Изменить

Сохраняю свою модель стандартным способом,

model.save("model")

Ниже представлена ​​конфигурация оптимизатора после загрузки. Конфигурация скорости обучения такая же, как и определение.

hour_glass_model.optimizer.get_config()
{'amsgrad': False,
 'beta_1': 0.9,
 'beta_2': 0.999,
 'decay': 0.0,
 'epsilon': 1e-07,
 'learning_rate': {'class_name': 'ExponentialDecay',
  'config': {'decay_rate': 0.96,
   'decay_steps': 1000,
   'initial_learning_rate': 0.01,
   'name': None,
   'staircase': True}},
 'name': 'Adam'}

person sreagm    schedule 01.03.2021    source источник


Ответы (2)


Когда вы перезапускаете обучение после использования model.save, он тренируется с той скоростью обучения, которая была при сохранении модели. Чтобы убедиться, что я написал простой обратный вызов, используя обратный вызов планировщика скорости обучения. Код для обратного вызова показан ниже. Затем я обучил модель для 5 эпох, сохранил модель, загрузил ее и снова обучил. Обратный вызов печатает значение скорости обучения в начале каждой эпохи и показывает, когда обучение возобновляется, скорость обучения была сохранена.

def scheduler(epoch, lr):
    lrin=lr
    if epoch < 2:
     lrout=lr
    else:
        lrout= lr * .5
    print ('At the start of epoch ', epoch+1, 'lr is ', lrin, ' will be set to ', lrout, ' for epoch ', epoch+2)
    return lrout
lrs=tf.keras.callbacks.LearningRateScheduler(scheduler)

поместите это в свой код перед вызовом model.fit. затем в model.fit включить

callbacks=[lrs]
person Gerry P    schedule 01.03.2021
comment
Спасибо, @Gerry P, за проверку. Отлично сделано. - person sreagm; 02.03.2021

Зависит от того, как вы сохраните свою модель. Если вы используете стандартный подход с Model.save() , состояние оптимизатора сохраняется. конфигурация оптимизатора сохранена. Скорость обучения будет начинаться с начального значения

Ссылка: https://www.tensorflow.org/guide/keras/save_and_serialize

См. Также save API, который по умолчанию include_optimizer=True

person Proko    schedule 01.03.2021
comment
Я сохраняю модель как SavedModel. Оптимизатор загруженной модели включает планировщик со своей конфигурацией по умолчанию. Поэтому я сомневаюсь, что обучение начинается снова с начальной скорости обучения или со скоростью обучения, когда обучение было ранее остановлено при сохранении. - person sreagm; 01.03.2021
comment
@sreagm, пожалуйста, обновите свой вопрос, добавив фрагмент кода, который точно соответствует вашему способу сохранения модели. Только тогда я могу сказать тебе точно - person Proko; 01.03.2021
comment
Спасибо @Proko за ценные указания. - person sreagm; 02.03.2021