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

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

Keras - это библиотека глубокого обучения, построенная поверх других библиотек глубокого обучения, таких как Tensorflow, CNTK, Theano.

Давайте обсудим следующие функции обратного вызова:

  1. Базовый регистратор
  2. Завершить при NaN
  3. Progbar Logger
  4. История
  5. Контрольная точка модели
  6. Ранняя остановка
  7. Удаленный монитор
  8. Планировщик скорости обучения
  9. ReduceLR на плато
  10. Регистратор CSV
  11. Лямбда-обратный вызов
  12. TensorBoard

Давайте посмотрим на использование каждого обратного вызова

1 - BaseLogger:

from keras.callbacks import BaseLogger
baselogger = BaseLogger(stateful_metrics = None)

По умолчанию stateful_metrics = None; Это означает, что любая точность и потери, которые мы получаем после каждой эпохи, на самом деле являются средним значением точности / потерь по всем партиям в эту эпоху.

если мы передадим stateful_metrics = [‘acc’, ‘loss’], тогда мы сможем получить потери и точность для финальной партии вместо ср. стоимость всех партий за эпоху.

2 - Завершить при NaN:

from keras.callbacks import TerminateOnNaN
terminate = TerminateOnNaN()

Если при обучении модели глубокого обучения мы передадим этот конечный объект в список обратных вызовов, то обучение будет остановлено, когда потеря NaN будет обнаружена после определенной эпохи.

3 - Progbar Logger:

from keras.callbacks import ProgbarLogger
progbar = ProgbarLogger(count_mode=’samples’, stateful_metrics=None)

count_mode = «образцы» или «шаги». Для управления отображением прогбара «шаги» (количество просмотренных партий) или «образцы» (количество просмотренных образцов).

stateful_metrics = [‘acc’], все показатели (в виде строк), которые мы передаем внутри этого списка, не будут усредняться за эпоху. Все остальные метрики будут усреднены за эпоху (как описано в BaseLogger).

4 - История:

from keras.callbacks import History
model_history = History()

Эта функция обратного вызова записывает / регистрирует все события модели для каждой эпохи в объекте model_history

model_history.epoch возвращает список эпох

model_history.history возвращает словарь с ключами как разные события и их значения после каждой эпохи как список

model_history.keys() возвращает все различные события, использованные во время тренировки

model_history.params() предоставляет информацию обо всех параметрах, используемых при обучении модели.

5 - ModelCheckpoint:

from keras.callbacks import ModelCheckpoint
checkpoint = ModelCheckpoint(filepath, monitor=’val_loss’, verbose=0, save_best_only=False, save_weights_only=False, mode=’auto’, period=1)

Этот обратный вызов используется для сохранения лучшей модели или моделей после каждой эпохи и использования ее для прогнозов в будущем.

путь к файлу: путь для сохранения модели «.../classifier.hdf5». если вы хотите сохранять после каждой эпохи, ".../classifier-{epoch:02d}-{val_acc:.2f}.hdf5".

монитор: событие, на основании которого вы хотите сохранить свою модель. Если это значение val_loss, то мы получим лучшую модель, в которой значение val_loss наименьшее среди всех эпох. Если его точность, то мы получим лучшую модель, в которой значение val_acc является самым высоким среди всех эпох.

подробный: 1 означает, что мы узнаем, что происходит во время обучения в терминале.

save_best_only: если задано значение True, будет сохранена только лучшая модель. Если значение равно False, модель будет сохраняться после каждой эпохи.

режим: обычно используется «авто». Если режим установлен на «min» и monitor = «val_loss», то модель будет сохранена только в том случае, если значение val_loss будет уменьшено. Если режим установлен на «max» и monitor = «val_acc». тогда модель будет сохранена только в случае улучшения val_acc.

save_weights_only: если задано значение True, будут сохранены только веса модели. В противном случае будет сохранена вся модель.

период: целое число, если его 2, то через каждые 2 эпохи будет вызываться этот обратный вызов.

6 - Ранняя остановка:

from keras.callbacks import EarlyStopping
earlystopping = EarlyStopping(monitor=’val_loss’, min_delta=0, patience=0, verbose=0, mode=’auto’, baseline=None, restore_best_weights=False)

EarlyStopping предотвращает переобучение модели.

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

монитор, режим: то же, что и в ModelCheckpoint

min_delta: минимальное количество изменений, которое должно произойти в отслеживаемом событии, чтобы рассматривать его как улучшение. Если min_delta равно 0,5, monitor = ‘val_acc’, тогда, если точность не улучшается на 0,5 после каждой эпохи, это не считается улучшением. разница рассчитывается ч / б текущим событием и лучшим событием.

терпение: количество эпох, в течение которых следует ждать улучшения отслеживаемого события.

restore_best_weights: после получения лучших весов в определенную эпоху модель все еще работает, пока не превысит уровень терпения. Итак, чтобы получить наилучшие веса, установите для этого параметра значение True.

базовый: минимальная сумма, которую вы должны получить за отслеживаемое событие. Допустим, вы отслеживаете «val_acc», базовый уровень = 0,85, но если ваш val_acc = 0,75 после определенных эпох (›терпение), ваша модель перестает обучаться.

7 - Удаленный мониторинг:

from keras.callbacks import RemoteMonitor()
remotemonitor = RemoteMonitor(root=’http://localhost:5000', path=’/publish/epoch/end/’, field=’data’, headers=None, send_as_json=False)

Этот обратный вызов используется для потоковой передачи событий на сервер.

8 - Планировщик LearningRate:

from keras.callbacks import LearningRateScheduler
lrscheduler = LearningRateScheduler(schedule,verbose)

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

Если наша скорость обучения (альфа) слишком мала, нейронной сети будет слишком сложно обучаться.

Если наша скорость обучения (альфа) слишком высока, тогда модель может выйти за глобальный минимум.

W = w + (альфа). Градиент

альфа: шаг / прыжок мы делаем по градиенту

Если мы обучаем нашу модель для всех эпох с одинаковой скоростью обучения, она эффективна не во всех случаях. По мере того, как мы приближаемся к глобальному минимуму, уменьшение нашего LR помогает модели лучше сходиться.

Существует 3 типа графиков LR: временное затухание, экспоненциальное затухание и ступенчатое затухание.

schedule: функция, которая принимает индекс эпохи и текущий lr в качестве входных данных и возвращает обновленный lr.

9 - Уменьшите LR на плато:

from keras.callbacks import ReduceLROnPlateau
reduce_lr = ReduceLROnPlateau(monitor=’val_loss’, factor=0.1, patience=10, verbose=0, mode=’auto’, min_delta=0.0001, cooldown=0, min_lr=0)

кулдаун: количество периодов ожидания, чтобы применить изменения после уменьшения LR.

Этот обратный вызов используется для снижения скорости обучения, когда показатель перестает улучшаться сверх уровня терпения.

10 - CSVLogger:

from keras.callbacks import CSVLogger
csvlogger = CSVLogger(filename, separator=’,’ , append=False)

Этот обратный вызов сохраняет все события в CSV-файл.

имя_файла: имя файла для сохранения в виде CSV-файла.

seperator: строка, используемая для разделения элементов в CSV-файле.

append: если установлено значение true, результаты обучения добавляются в тот же файл CSV. если установлено значение False, он перезаписывает файл csv.

12. Тензорборд:

from keras.callbacks.tensorboard_v1 import TensorBoard
tensorboard = TensorBoard(log_dir=’./logs’, histogram_freq=0, batch_size=32, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None, embeddings_data=None, update_freq=’epoch’)

Запустите эту команду в своем терминале:

tensorboard — logdir=“path to logs file” для визуализации результатов.

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