Обратные вызовы позволяют изменять настройки или сохранять модель во время обучения.
В этой статье вы узнаете, как использовать обратный вызов ModelCheckpoint в Keras, чтобы сохранить лучшую версию вашей модели во время обучения.
Моделирование - это весело!
Мне нравится создавать прогностические модели глубокого обучения. Мне нравится наблюдать за результатами тренировок, видеть, как падают потери, и наблюдать за расходящимися потерями между тренировочными и проверочными наборами, которые указывают на переобучение. Но иногда модель находит отличное решение ... и продолжает обучение решению, которое работает только для обучающей выборки. Теперь, если я буду там и смотреть, как на садок с рыбой, я могу прервать тренировку, пока не будет нанесен слишком большой урон. Но кто хочет сидеть и смотреть на тренировки целый день? То есть, да, но лучше во время длительных тренировок потратить время на другую работу.
Затем я узнал об обратных вызовах Keras и, в частности, о ModelCheckpoint!
Перетренированность
Лучшие спортсмены всегда готовы перетренироваться. Правильный подход к тренировкам оптимизирует спортивные результаты спортсмена, но слишком много тренировок ведет к травмам и снижению показателей. Модели глубокого обучения похожи. Правильный объем обучения делает модель сильной, но слишком много и производительность может упасть на новых данных.
Во время обучения модели глубокого обучения стремятся минимизировать свои потери, чтобы быть более точными в соответствии с заданной функцией потерь. Однако они судят об этой точности по набору данных, на которых они тренируются. Представьте себе школьника, который проходит домой практический тест и запоминает все поставленные на нем задачи и каждый ответ. Если они не найдут лежащих в основе шаблонов, стратегий, для оценки которых предназначен тест, они будут в растерянности, потому что на экзамене не будет ни одного из вопросов практического теста!
Модели глубокого обучения могут делать то же самое. Если они слишком много тренируются на наборе данных, они могут изучить этот набор данных конкретно, вместо того, чтобы подбирать базовые функции, соединяющие объекты и метки. Модель может перекрывать данные.
Существует множество стратегий борьбы с переобучением в прогнозном моделировании, и их следует применять по мере необходимости, но переобучение от переобучения представляет собой уникальную опасность.
К счастью, у Кераса есть помощь в виде обратных вызовов! Прежде чем я узнал об обратных вызовах, я думал, что должен угадать правильное количество эпох обучения или использовать метод проб и ошибок, чтобы настроить их. К счастью, нет! Мы можем использовать обратный вызов Keras keras.callbacks.ModelCheckpoint(), чтобы сохранить модель в наиболее эффективную эпоху.
Обратные вызовы
Обратный вызов - это функция, которая может выполняться после каждой эпохи. В качестве аргументов он принимает номер эпохи и любые метрики, которые ваша модель отслеживает. Их можно использовать для таких полезных вещей, как планирование снижения скорости обучения (я люблю хорошо настроенную снижающуюся скорость обучения, не так ли?), Раннее прекращение обучения или сохранение модели между эпохами. Вы даже можете кодировать свои собственные функции обратного вызова для своих особых целей.
Если вы хотите узнать больше обо всех доступных обратных вызовах, ознакомьтесь с документацией Keras здесь.
Модель
Один из моих любимых обратных вызовов - ModelCheckpoint. Мне нравится многозадачность, и я часто открываю несколько окон Google Colab, устанавливаю некоторые глубокие модели для обучения в них, а затем работаю над другими задачами на моем локальном компьютере (у меня нет оборудования графического процессора для эффективного обучения модели Tensorflow, например Google делает). Я могу настроить свои модели на обучение немного дольше, чем я думаю, что им может понадобиться, и вернуться позже, чтобы загрузить их с той точки, которая была до того, как они начали переобучаться и терять точность на проверочном наборе.
Обратный вызов ModelCheckpoint можно загрузить из keras.callbacks
from keras.callbacks import ModelCheckpoint
Мы инициализируем объект класса, указав путь к файлу, в который нужно сохранить, условия, при которых мы хотим его сохранить, и степень прозрачности процесса. Например, предположим, что нам нужна только самая лучшая версия модели, и мы определяем «лучшую» как версию с наименьшими потерями при проверке. Вы можете выбрать в качестве триггера либо функцию потерь, либо любую из метрик, переданных в аргумент metrics при компиляции модели.
Мы бы инициализировали наш обратный вызов следующим образом:
checkpoint = ModelCheckpoint(filepath=filepath,
monitor=’val_loss’,
verbose=1,
save_best_only=True,
mode=’min’)
Один крутой трюк для сохранения нескольких раз - добавить номер эпохи и / или текущую метрику, которую вы отслеживаете, в путь к файлу, поскольку эпоха будет передана объекту ModelCheckpoint.
filepath = 'my_best_model.epoch{epoch:02d}-loss{val_loss:.2f}.hdf5'
Вышеупомянутое сохранит вашу модель на диск как-то вроде:
my_best_model.epoch_01-loss_13.31.hdf5
Вернуться к обратным вызовам
Модели Keras принимают список обратных вызовов в качестве аргумента в вызове .fit(). Аргумент ожидает список, даже если вы передаете только один обратный вызов. Однако вы можете украсить свою модель всевозможными причудливыми обратными вызовами. Моя любимая комбинация - это ModelCheckpoint и ReduceLROnPlateau. Второй контролирует метрику и снижает скорость обучения на заданную величину, когда эта метрика выходит на плато.
Мы передаем наш список обратных вызовов методу .fit() следующим образом:
callbacks = [checkpoint, <other_callbacks_you_want>]
model.fit(X_train,
y_train,
epochs=epochs
callbacks=callbacks)
Сохранение моделей
Примечание о сохранении моделей: модели, сохраненные в формате .hdf5, великолепны, потому что вся модель находится в одном месте и может быть загружена в другое место, например, при развертывании. Однако файлы могут увеличиваться в размерах, и сохранение вашей модели в каждую эпоху может быстро увеличить объем памяти. В конструкторе обратного вызова ModelCheckpoint доступен один вариант save_weights_only=True. Это сэкономит место, но не спасет всю архитектуру модели. Чтобы восстановить его, вы должны перестроить модель и затем назначить сохраненные веса, а не просто загружать все за один шаг.
Еще одна странность, которую я обнаружил, заключается в том, что не каждый слой нравится сохранять в формате .hdf5. В предыдущем сообщении блога я показал вам, как добавить слой TextVectorization в модель НЛП, чтобы выполнить предварительную обработку как часть самой модели. Однако я обнаружил, что не смогу сохранить свою модель в формате .hdf5, если бы использовал этот слой. Однако, если я оставлю расширение .hdf5, тогда keras сохранит модель как файловый каталог ресурсов, и это работает для слоя TextVectorization.
После подгонки мы можем перезагрузить нашу модель для оценки в наиболее эффективную эпоху с помощью:
model = keras.models.load_model(filepath)
Давайте посмотрим все это в действии!
Данные предоставлены Университетом Карнеги-Меллона через библиотеку Statlib. Embedded Gist от автора
Я надеюсь, что ModelCheckpoint и другие обратные вызовы, которые предоставляет Keras, а также те, которые вы придумаете сами, помогут вам создать лучшие прогнозные модели!
Резюме
В этой статье вы узнали об обратных вызовах для глубоких моделей с использованием Keras api для Tensorflow. В частности, вы узнали, как использовать обратный вызов ModelCheckpoint, чтобы сохранить лучшую версию вашей модели до того, как она перегружается, и несколько способов настроить обратный вызов.
Как всегда, используйте свои способности в науке о данных во благо и получайте много удовольствия! Пожалуйста, оставляйте любые вопросы, комментарии или добрые и вежливые отзывы в комментариях.
Удачного моделирования!