Я хочу реализовать двухэтапный процесс обучения, где:
1) предварительно обучить модель для нескольких эпох, используя функцию потерь loss_1
2) измените функцию потерь на loss_2
и продолжите обучение тонкой настройке
В настоящее время мой подход:
model.compile(optimizer=opt, loss=loss_1, metrics=['accuracy'])
model.fit_generator(…)
model.compile(optimizer=opt, loss=loss_2, metrics=['accuracy’])
model.fit_generator(…)
Обратите внимание, что оптимизатор остается прежним, и изменяется только функция потерь. Я бы хотел плавно продолжить тренировки, но с другой функцией потерь. Согласно этой записи , перекомпиляция модели теряет состояние оптимизатора. Вопросы:
a) Потеряю ли я состояние оптимизатора, даже если использую тот же оптимизатор , например, Adam?
б) если ответ на а) положительный, какие-либо предложения о том, как изменить функцию потерь на новую без сброса состояния оптимизатора?
EDIT:
По предложению Саймона Кэби и основываясь на этой теме , я создал собственную функцию потерь с двумя расчетами потерь, которые зависят от числа эпох. Тем не менее, это не работает для меня. Мой подход:
def loss_wrapper(t_change, current_epoch):
def custom_loss(y_true, y_pred):
c_epoch = K.get_value(current_epoch)
if c_epoch < t_change:
# compute loss_1
else:
# compute loss_2
return custom_loss
И я компилирую следующим образом, после инициализации current_epoch
:
current_epoch = K.variable(0.)
model.compile(optimizer=opt, loss=loss_wrapper(5, current_epoch), metrics=...)
Чтобы обновить current_epoch
, я создаю обратный вызов:
class NewCallback(Callback):
def __init__(self, current_epoch):
self.current_epoch = current_epoch
def on_epoch_end(self, epoch, logs={}):
K.set_value(self.current_epoch, epoch)
model.fit_generator(..., callbacks=[NewCallback(current_epoch)])
Обратный вызов корректно обновляет self.current_epoch
каждую эпоху. Но обновление не достигает пользовательской функции потери. Вместо этого current_epoch
сохраняет значение инициализации навсегда, а loss_2
никогда не выполняется.
Любые предложения приветствуются, спасибо!