Перейти к содержанию

Обратные вызовы

Использование обратных вызовов (callbacks)

Callback – набор функций, применяемых в определенные моменты во время процедуры обучения. Вы можете использовать функции callback чтобы получить информацию о внутреннем состоянии модели в процессе обучения. Нужно передавать список callback’ов (именованным аргументом callbacks) методу .fit() Sequential или Model классов. Подходящие методы callback будут вызваны на каждой стадии обучения.

Callback

keras.callbacks.callbacks.Callback() 

Абстрактный базовый класс для разработки новых callback’ов

Свойства

— params: словарь. Параметры обучения (к примеру, размер батча, эпоха)

— model: экземпляр keras.models.Model. Ссылка на обучаемую модель.

Словарь logs,  который методы callback принимают в качестве аргумента, будет содержать параметры, релевантные для текущего батча или эпохи.

На данный момент, метод .fit() класса Sequential в словаре logs содержит следующие величины, которые передаются методам callback:

— on_epoch_end: logs по умолчанию влючает в себя acc и loss, опционально может включать val_loss(если проверочная выборка включена в fit) и val_acc(если проверочная выборка включена в fit и мониторинг точности был включен).

— on_batch_begin: logs включает в себя параметр size – число образцов в текущем батче.

— on_batch_end: logs будет содержать параметр loss, и, опционально, acc (если мониторинг точности был включен)

BaseLogger

keras.callbacks.callbacks.BaseLogger(stateful_metrics=None

Callback, собирающий среднее значение метрик на эпохе. По умолчанию он применяется к каждой модели keras.

Аргументы

— stateful_metrics: Итерируемый объект строковых имен метрик, которые не усредняются. Метрики в этом списке будут записаны «как есть» в on_epoch_end. Все остальные метрики будут усреднены и записаны в on_epoch_end.

TerminateOnNaN

keras.callbacks.callbacks.TerminateOnNaN()

Callback, останавливающий обучение когда встречается NaN loss.

ProgbarLogger

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

Callback выводящий метрики в stdout (стандартный интерфейс вывода).

Аргументы

— count_mode: “steps” или “samples”.

— stateful_metrics: Итерируемый объект строковых имен метрик, которые не усредняются. Метрики в этом списке будут записаны «как есть»

Исключения

— ValueError: Если в cout_mode подано неверное значение

History

keras.callbacks.callbacks.History() 

Callback, записывающий события в объект History. По умолчанию он применяется к каждой модели keras. Объект History возвращается методом модели fit.

ModelCheckpoint

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

Сохранение модели после каждой эпохи.

Filepath может содержать именованные опции форматирования, заполняемые значениями epoch и ключами в logs (передаваемыми on_epoch_end).

К примеру: если filepath назван weights.{epoch:02d}-{val_loss:.2f}.hdf5, тогда модель будет сохраняться с номером эпохи и validation_loss в имени файла.

Аргументы:

— filepath: строка, путь сохранения модели

— monitor: параметр для мониторинга

— verbose: режим отображения, 0 или 1

— save_best_only: если save_best_only=True, если результат текущей эпохи хуже предыдущей, он не будет сохранен.

— save_weights_only: если True, тогда будут сохраняться только веса модели (model.save_weights(filepath)), в противном случае будет сохраняться вся модель (model.save(filepath)).

— mode: один из {auto, min, max}. Если save_best_only=True, решение о перезаписи текущего файла будет приниматься в зависимости от уменьшения/увеличения параметра мониторинга. Для val_acc, необходим max, для val_loss необходим min. В auto режиме, mode выбирается в зависимости от имени monitor.

— period: Интервал (число эпох) между сохранениями.

EarlyStopping

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

Прекращение обучения, когда параметр monitor перестает улучшаться.

Аргументы

— monitor: параметр для мониторинга

— min_delta: минимальное значение изменения величины monitor, расцениваемое как улучшение, то есть, если абсолютное изменение меньше min_delta, то улучшение не засчитывается

— patience: число эпох, за которые величина monitor не улучшается, после которых обучение будет остановлено. Проверочные величины могут производиться не после каждой эпохи если validation_freq (model.fit(validation_freq=5)) больше единицы.

— verbose: режим отображения, 0 или 1.

— mode: один из {auto, min, max}. В режиме min, обучение остановится когда величина monitor перестанет уменьшаться; в режиме max, обучение остановится когда величина monitor перестанет увеличиваться; в режиме auto, mode выбирается в зависимости от имени monitor.

— baseline: значение, которое должна достичь величина monitor. Обучение прекратится, если модель не 

— restore_best_weights: восстанавливать ли веса модели с эпохи с лучшем значением параметра monitor. Если False, веса модели будут загружены из последней шага обучения.

RemoteMonitor

keras.callbacks.callbacks.RemoteMonitor(root=’http://localhost:9000′, path=’/publish/epoch/end/’, field=’data’, headers=None, send_as_json=False

Callback, передающий события на сервер.

Необходима библиотека requests. События по умолчанию отправляются в каталог root + ‘/publish/epoch/end/’. Вызовы – это HTTP POST, с аргументом data, который является JSON-закодированным словарем событий. Если send_as_json присвоен True, тип контента в запросе будет приложением/JSON. В противном случае сериализованный  JSON будет отправлен внутри формы.

Аргумент

— root: Строка;  корневой каталог целевого сервера

— path: Строка; относительный к root путь, в который будут посылаться события

— field: Строка;  поле JSON в котором будут храниться данные. Field используется только если данные пересылаются через форму(то есть send_as_json установлен как False)

— headers: Словарь; дополнительные пользовательские заголовки HTTP.

— send_as_json: Boolean; посылать ли запрос как приложение/json.

LearningRateScheduler

keras.callbacks.callbacks.LearningRateScheduler(schedule, verbose=0) 

Планировщик скорости обучения 

Аргументы

— schedule: функция, принимающая индекс эпохи (integer, отсчет с нуля) и текущую скорость обучения, и возвращающая новую скорость обучения (float).

— verbose: int. 0: «тихий» режим, 1: выводить сообщения

ReduceLROnPlateau

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

Уменьшение скорости обучения, когда метрика перестала улучшаться.

Модели зачастую работают лучше если уменьшать скорость обучения на коэффициент от 2 до 10 как только в обучении происходит стагнация. Этот callback следит за параметром monitor и, если не происходит улучшения за patience эпох, уменьшает скорость обучения.

Пример

reduce_lr = ReduceLROnPlateau(monitor=’val_loss’, factor=0.2,

                              patience=5, min_lr=0.001)

model.fit(X_train, Y_train, callbacks=[reduce_lr]) 

Аргументы

— monitor:  параметр для мониторинга

— factor: коэффициент уменьшения скорости обучения. new_lr = lr * factor

— patience: число эпох, за которые величина monitor не улучшается, после которых обучение будет остановлено. Проверочные величины могут производиться не после каждой эпохи если validation_freq (model.fit(validation_freq=5)) больше единицы.

— verbose: int. 0: «тихий» режим, 1: выводить сообщения

— mode: один из {auto, min, max}. В режиме min, скорость обучения уменьшится когда величина monitor перестанет уменьшаться; в режиме max, скорость обучения уменьшится когда величина monitor перестанет увеличиваться; в режиме auto, mode выбирается в зависимости от имени monitor.

— min_delta: минимальное значение изменения величины monitor, расцениваемое как улучшение, то есть, если абсолютное изменение меньше min_delta, то улучшение не засчитывается

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

— min_lr: нижняя граница скорости обучения

CSVLogger

keras.callbacks.callbacks.CSVLogger(filename, separator=’,’, append=False

Callback, записывающий результаты эпох в csv файл.

Поддерживает любые значения, которые можно представить в виде строки, включая одномерные итерируемые объекты, такие как np.ndarray.

Пример

csv_logger = CSVLogger(‘training.log’)

model.fit(X_train, Y_train, callbacks=[csv_logger]) 

Аргументы

— filename: имя csv файла (к примеру: ‘run/log.csv’)

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

— append: True: добавить к существующему файлу (если он существует). False: перезаписать существующий файл.

LambdaCallback

keras.callbacks.callbacks.LambdaCallback(on_epoch_begin=None, on_epoch_end=None, on_batch_begin=None, on_batch_end=None, on_train_begin=None, on_train_end=None) Callback для создания простых пользовательских callback’ов «на лету».

Этот callback собирается с помощью анонимных функций. Обратите внимание, что callback’и ожидают позиционных аргументов, таких как:

— on_epoch_begin и on_epoch_end ожидают два позиционных аргумента: epochs, logs.

— on_batch_begin и on_batch_end ожидают два позиционных аргумента: batch, logs.

— on_train_begin и on_train_end ожидают один позиционных аргумент: logs

Аргументы

— on_epoch_begin: вызывается в начале каждой эпохи

— on_epoch_end: вызывается в конце каждой эпохи

— on_batch_begin: вызывается в начале каждого батча

— on_batch_end: вызывается в конце каждого батча

— on_train_begin: вызывается в начале обучения модели

— on_train_end: вызывается в конце обучения модели

Пример

# Выводить номер батча в начале каждого батча

batch_print_callback = LambdaCallback(

    on_batch_begin=lambda batch,logs: print(batch))

# Записывать loss эпохи в файл в формате JSON. 

# Состав файла —  не хорошо структурированный JSON, а скорее файл, 

# Имеющий объект JSON на каждой строке.

import json

json_log = open(‘loss_log.json’, mode=’wt’, buffering=1)

json_logging_callback = LambdaCallback(

    on_epoch_end=lambda epoch, logs: json_log.write(

        json.dumps({‘epoch’: epoch, ‘loss’: logs[‘loss’]}) + ‘\n’),

    on_train_end=lambda logs: json_log.close()

)

# Завершение некоторых процессов после окончания обучения модели

processes = …

cleanup_callback = LambdaCallback(

    on_train_end=lambda logs: [

        p.terminate() for p in processes if p.is_alive()])

model.fit(…,

          callbacks=[batch_print_callback,

                     json_logging_callback,

                     cleanup_callback])

TensorBoard

keras.callbacks.tensorboard_v1.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.

TensorBoard – средство визуализации, предоставляемое с библиотекой Tensorflow.

Этот callback записывает лог для TensorBoard, который позволяет визуализировать динамические графы обучающих и проверочных метрик, а также гистограммы активации для различных слоев модели.

Если вы установили TensorFlow с помощью pip, вы можете запустить TensorBoard из командной строки:

tensorboard —logdir=/full_path_to_your_logs

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

Аргументы

— log_dir: путь сохранения логов, которые TensorBoard будет использовать

— histogram_freq: частота (в эпохах), с которой вычислять гистограммы активаций и весов для слоев модели. Если histogram_freq = 0, вычисления гистограмм не будут происходить. Проверочный набор (val_data/val_split) должен быть задан для визуализации гистограмм.

— batch_size: размер батча для вычисления гистограмм.

— write_graph: визуализировать ли граф в TensorBoard. Файл логов может стать очень большим когда write_graph = True.

— write_grads: визуализировать ли гистограммы градиентов в TensorBoard. histogram_freq должен быть больше 0.

— write_images: записывать ли веса модели для визуализации в качестве изображения в TensorBoard.

— embeddings_freq: частота (в эпохах), с которой выбранные Embedding слои будут сохранены. Если embeddings_freq = 0, embedding’и не будут вычисляться. Данные для визуализации во вкладке Embedding инструмента TensorBoard передаются через embeddings_data.

— embedding_layer_names: список имен слоев, которые нуждаются в мониторинге. Елси None или пустой список – все слои будут учитыватся.

— embedding_metadata: словарь, связывающий имя слоя с именем файла, в котором храняться метаданные для этого слоя. Детали о формате файлов метаданных. В случае, если для всех Embedding слоев используется один файл, можно передавать не словарь, а строку.

— embedding_data: данные, используемые в Embedding слоях, объявленных в embeddings_layer_names. Массив numpy (если у модели один вход) или список массивов (если несколько). Больше об Embedding.

— update_freq: ‘batch’, или, ‘epoch’ или integer. При использовании ‘batch’, записывать потери и метрики в TensorBoard после каждого батча. По такому же принципу с ‘epoch’. При использовании integer (числа), к примеру 10000, callback запишет метрики и потери в Tensorboard после каждыз 10000 примеров. Обратите внимание, что слишком частая запись может замедлить процесс обучения.

Создание callback’ов

Вы можете создать callback, наследуя от базового класса keras.callbacks.Callback. Callback имеет доступ к связанной с ним модели через свойство класса self.model.

Простой пример сохранения списка потерь на каждом батче во время обучения:

class LossHistory(keras.callbacks.Callback):

    def on_train_begin(self, logs={}):

         self.losses = []

     def on_batch_end(self, batch, logs={}):

        self.losses.append(logs.get(‘loss’))

Пример: запись истории потерь

class LossHistory(keras.callbacks.Callback):

    def on_train_begin(self, logs={}):

        self.losses = []

    def on_batch_end(self, batch, logs={}):

        self.losses.append(logs.get(‘loss’))

model = Sequential()

model.add(Dense(10, input_dim=784, kernel_initializer=’uniform’))

model.add(Activation(‘softmax’))

model.compile(loss=’categorical_crossentropy’, optimizer=’rmsprop’)

history = LossHistory()

model.fit(x_train, y_train, batch_size=128, epochs=20, verbose=0, callbacks=[history])

print(history.losses)

# outputs

»’

[0.66047596406559383, 0.3547245744908703, …, 0.25953155204159617, 0.25901699725311789]

»’

Пример: сохранение модели после каждой эпохи

from keras.callbacks import ModelCheckpoint

model = Sequential()

model.add(Dense(10, input_dim=784, kernel_initializer=’uniform’))

model.add(Activation(‘softmax’))

model.compile(loss=’categorical_crossentropy’, optimizer=’rmsprop’)

»’

Сохранение модели после каждой эпохи, если ошибка на проверочном наборе уменьшилась

»’

checkpointer = ModelCheckpoint(filepath=’/tmp/weights.hdf5′, verbose=1, save_best_only=True)

model.fit(x_train, y_train, batch_size=128, epochs=20, verbose=0, validation_data=(X_test, Y_test), callbacks=[checkpointer])