Перейти к содержимому
НейроКуб
Открытый материал · 3 мин
Даниил Баланс

Keras остановила обучение. Почему лучшие веса могли остаться на прошлой эпохе

EarlyStopping по умолчанию оставляет последние веса. Разбираем, как выбрать лучший результат по валидации, сохранить его в файл и не спутать остановку с восстановлением.

Обучение завершилось по EarlyStopping, а качество сохранённой модели хуже лучшего значения в журнале. Это возможно без ошибки библиотеки: остановка и возврат к лучшей эпохе в Keras настраиваются отдельно. Перед новым запуском проверьте, какой именно результат остаётся у вас в памяти и на диске.

Остановка не выбирает веса автоматически

У EarlyStopping параметр restore_best_weights по умолчанию равен False. Callback следит за выбранной величиной и останавливает fit, когда улучшения закончились, но оставляет веса последнего шага. Чтобы вернуть веса лучшей эпохи по этой величине, включите restore_best_weights=True.

Условный пример: val_loss по эпохам равен 0,50; 0,40; 0,42; 0,43. При monitor="val_loss", mode="min", patience=2 и min_delta=0 обучение остановится после двух эпох без улучшения. Лучшее значение было на второй эпохе. Без восстановления останутся более поздние веса. Это иллюстрация правила, а не результат проведённого эксперимента.

Patience задаёт число эпох без улучшения, а min_delta — минимальную абсолютную величину изменения, которую считать улучшением. Для растущей метрики нужен mode="max". Имя monitor должно реально присутствовать в журнале: для val_loss нужны данные валидации. Иначе сравнивать будет нечего.

Память и файл — две отдельные проверки

Если лучший вариант должен пережить завершение процесса, добавьте ModelCheckpoint с save_best_only=True. Согласуйте monitor и mode у обоих callback. В простом примере оставьте min_delta=0: если пороги улучшения различаются, выбранные эпохи тоже могут разойтись.

callbacks = [
    keras.callbacks.EarlyStopping(
        monitor="val_loss", mode="min", patience=2,
        restore_best_weights=True),
    keras.callbacks.ModelCheckpoint(
        "best.keras", monitor="val_loss", mode="min",
        save_best_only=True),
]
# Передайте callbacks и validation_data в model.fit().

Здесь best.keras сохраняет полную модель при улучшении, а восстановление возвращает лучшие веса в текущий объект после обучения. Не считайте эти действия взаимозаменяемыми. Если monitor указан неверно, одно наличие файла ещё не доказывает, что отбор сработал.

Как принять результат

После fit откройте history.history и найдите минимум выбранной метрики. Затем загрузите best.keras в отдельный объект и оцените его на тех же данных валидации с тем же препроцессингом. Руководство Keras разделяет обучение, валидацию и итоговую оценку на тестовых данных. Не превращайте тестовую выборку в ещё один регулятор остановки.

Критерий успеха: вы можете назвать выбранную эпоху, метрику отбора и файл, из которого восстановлен результат.

Если цифры расходятся, сначала проверьте настройки callback и данные оценки. Дополнительные эпохи сами по себе эту путаницу не исправят. А «лучшие» здесь всегда означает лучшие по заданному monitor, а не универсально лучшие для любой будущей задачи.

Комментарии

Пока нет комментариев. Начните обсуждение.