Usage of callbacks

回调是在训练过程的给定阶段要应用的一组功能. 您可以使用回调在训练期间查看模型的内部状态和统计信息. 您可以将回调列表(作为关键字参数callbacks )传递给SequentialModel类的.fit()方法. 然后,将在培训的每个阶段调用回调的相关方法.


[source]

Callback

keras.callbacks.callbacks.Callback()

用于建立新回调的抽象基类.

Properties

  • 参数 :dict. 训练参数(例如,详细程度,批次大小,时期数...).
  • 模型keras.models.Model实例. 被训练模型的参考.

回调方法作为参数的logs字典将包含与当前批次或时期相关的数量的键.

当前, Sequential模型类的.fit()方法将在传递给其回调的logs中包含以下数量:

on_epoch_end:日志包括accloss ,并可选地包括val_loss (如果在fit启用了验证)和val_acc (如果启用了验证和准确性监视). on_batch_begin:日志包括size ,当前批次中的样本数. on_batch_end:日志包括loss和可选的acc (如果启用了准确性监视).


[source]

BaseLogger

keras.callbacks.callbacks.BaseLogger(stateful_metrics=None)

累积指标的时期平均值的回调.

该回调将自动应用于每个Keras模型.

Arguments

  • stateful_metrics:可迭代应该在一个时代进行平均指标的字符串名称. 此列表中的指标on_epoch_end记录在on_epoch_end . 所有其他值将在on_epoch_endon_epoch_end平均值.

[source]

TerminateOnNaN

keras.callbacks.callbacks.TerminateOnNaN()

遇到NaN丢失时终止训练的回调.


[source]

ProgbarLogger

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

将指标输出到标准输出的回调.

Arguments

  • count_mode :"步骤"或"样本"之一. 进度条是否应该计算看到的样本或看到的步数(批次).
  • stateful_metrics:可迭代应该在一个时代进行平均指标的字符串名称. 此列表中的指标将按原样记录. 所有其他值将随时间平均(例如,损失等).

Raises

  • ValueError :如果count_mode无效.

[source]

History

keras.callbacks.callbacks.History()

将事件记录到History对象中的回调.

该回调将自动应用于每个Keras模型. History对象通过模型的fit方法返回.


[source]

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 ).

例如:如果文件filepathweights.{epoch:02d}-{val_loss:.2f}.hdf5 ,则模型检查点将与时代号一起保存,并在文件名中包含验证损失.

Arguments

  • filepath :字符串,保存模型文件的路径.
  • monitor :要监视的数量.
  • verbose :详细模式,0或1.
  • save_best_only :如果save_best_only=True ,则根据监视数量的最新最佳模型将不会被覆盖.
  • save_weights_only :如果为True,则仅保存模型的权重( model.save_weights(filepath) ),否则保存完整的模型( model.save(filepath) ).
  • 模式 :{自动,最小,最大}之一. 如果save_best_only=True ,则基于监视数量的最大化或最小化来决定覆盖当前保存文件. 对于val_acc ,它应该是max ,对于val_loss它应该是min ,等等.在auto模式下,将根据监视数量的名称自动推断出方向.
  • period :检查点之间的间隔(历元数).

[source]

EarlyStopping

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

当监视的数量停止改善时,停止训练.

Arguments

  • monitor :要监视的数量.
  • min_delta :监视数量中符合改进的最小变化,即小于min_delta的绝对变化,将不视为任何改进.
  • 耐心 :产生受监控数量但没有改善的时期数,之后将停止训练. 如果验证频率( model.fit(validation_freq=5) )大于1,则可能不会为每个时期产生验证数量.
  • verbose :详细模式.
  • 模式 :{自动,最小,最大}之一. 在min模式下,当监视的数量停止减少时,训练将停止; 在max模式下,当监视的数量停止增加时,它将停止; 在auto模式下,将根据监视数量的名称自动推断出方向.
  • 基线 :要达到的监视数量的基线值. 如果模型没有显示出超过基线的改善,培训将停止.
  • restore_best_weights :是否从时期以受监视数量的最佳值恢复模型权重. 如果为False,则使用在训练的最后一步获得的模型权重.

[source]

RemoteMonitor

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

用于将事件流传输到服务器的回调.

需要requests库. 默认情况下,事件发送到root + '/publish/epoch/end/' . 调用是HTTP POST,其data参数是事件数据的JSON编码字典. 如果send_as_json设置为True,则请求的内容类型将为application / json. 否则,序列化的JSON将在表单中发送

Arguments

  • root :字符串; 目标服务器的根URL.
  • path :字符串; 相对于事件将发送到的root路径.
  • 字段 :字符串; 用于存储数据的JSON字段. 仅当有效载荷在表单内发送时才使用该字段(即send_as_json设置为False).
  • 标题 :字典; 可选的自定义HTTP标头.
  • send_as_json :布尔值; 请求是否应作为application / json发送.

[source]

LearningRateScheduler

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

学习率调度器.

Arguments

  • schedule :一个以纪元索引作为输入(整数,从0开始索引)和当前学习率并返回一个新的学习率作为输出(浮点数)的函数.
  • 详细 :int. 0:安静,1:更新消息.

[source]

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倍. 此回调监视数量,如果"耐心"的时期没有看到改善,则学习率会降低.

Example

reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
                              patience=5, min_lr=0.001)
model.fit(X_train, Y_train, callbacks=[reduce_lr])

Arguments

  • monitor :要监视的数量.
  • factor :学习率降低的因子. new_lr = lr *因子
  • 耐心 :产生受监控数量但没有改善的时期数,之后将停止训练. 如果验证频率( model.fit(validation_freq=5) )大于1,则可能不会为每个时期产生验证数量.
  • 详细 :int. 0:安静,1:更新消息.
  • 模式 :{自动,最小,最大}之一. 在min模式下,当监视的数量停止减少时,lr将减小; 在max模式下,当监视的数量停止增加时,它将减少; 在auto模式下,将根据监视数量的名称自动推断出方向.
  • min_delta :用于衡量新的最优值的阈值,仅关注重大变化.
  • cooldown :减少lr后恢复正常运行之前要等待的时期数.
  • min_lr :学习率的下限.

[source]

CSVLogger

keras.callbacks.callbacks.CSVLogger(filename, separator=',', append=False)

将纪元结果流式传输到csv文件的回调.

支持所有可以表示为字符串的值,包括一维可迭代对象,例如np.ndarray.

Example

csv_logger = CSVLogger('training.log')
model.fit(X_train, Y_train, callbacks=[csv_logger])

Arguments

  • filename :csv文件的文件名,例如'run / log.csv'.
  • spacer :用于分隔csv文件中元素的字符串.
  • append :true:如果文件存在,则追加(用于继续培训). False:覆盖现有文件,

[source]

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)

用于即时创建简单,自定义回调的回调.

此回调是使用匿名函数构造的,这些匿名函数将在适当的时间被调用. 请注意,回调需要位置参数,例如:

  • on_epoch_begin and on_epoch_end expect two positional arguments: epoch, logs
  • on_batch_beginon_batch_end两个位置参数: batchlogs
  • on_train_beginon_train_end期望一个位置参数: logs

Arguments

  • on_epoch_begin :在每个纪元开始时调用.
  • on_epoch_end: called at the end of every epoch.
  • on_batch_begin :在每个批处理的开头调用.
  • on_batch_end :在每个批处理的末尾调用.
  • on_train_begin :在模型训练开始时调用.
  • on_train_end :在模型训练结束时调用.

Example

# Print the batch number at the beginning of every batch.
batch_print_callback = LambdaCallback(
    on_batch_begin=lambda batch,logs: print(batch))

# Stream the epoch loss to a file in JSON format. The file content
# is not well-formed JSON but rather has a JSON object per line.
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()
)

# Terminate some processes after having finished model training.
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])

[source]

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 随附的可视化工具.

该回调为TensorBoard编写了一个日志,使您可以可视化训练和测试指标的动态图以及模型中不同层的激活直方图.

如果您已使用pip安装了TensorFlow,则应该能够从命令行启动TensorBoard:

tensorboard --logdir=/full_path_to_your_logs

当使用TensorFlow以外的后端时,TensorBoard仍然可以工作(如果您安装了TensorFlow),但是唯一可用的功能将是损耗和度量图的显示.

Arguments

  • log_dir :将TensorBoard解析的日志文件保存到的目录路径.
  • histogram_freq :计算模型各层的激活和权重直方图的频率(以历元为单位). 如果设置为0,将不计算直方图. 必须为直方图可视化指定验证数据(或拆分).
  • batch_size :要输入到网络以进行直方图计算的输入批次的大小.
  • write_graph :是否在TensorBoard中可视化图形. 当write_graph设置为True时,日志文件可能会变得很大.
  • write_grads :是否在TensorBoard中可视化梯度直方图. histogram_freq必须大于0.
  • write_images :是否编写模型权重以在TensorBoard中可视化为图像.
  • embeddings_freq :将保存选定嵌入层的频率(以时间为单位). 如果设置为0,则不会计算嵌入. 在TensorBoard的``嵌入''选项卡中可视化的数据必须作为embeddings_data传递.
  • embeddings_layer_names :需要注意的图层名称列表. 如果为None或为空列表,则将监视所有嵌入层.
  • embeddings_metadata :将层名称映射到文件名的字典,该嵌入层的元数据保存在该文件名中. 查看有关元数据文件格式的详细信息 . 如果相同的元数据文件用于所有嵌入层,则可以传递字符串.
  • embeddings_data :要嵌入在embeddings_layer_names指定的层上的数据. Numpy数组(如果模型有一个输入)或Numpy数组列表(如果模型有多个输入). 了解有关嵌入的更多信息 .
  • update_freq'batch''epoch'或整数. 使用'batch' ,每批之后将损失和指标写入TensorBoard. 'epoch'同样适用. 如果使用整数,例如10000 ,则回调将每10000个样本将指标和损失写入TensorBoard. 请注意,过于频繁地向TensorBoard写入可能会减慢您的训练速度.

Create a callback

您可以通过扩展基类keras.callbacks.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'))

Example: recording loss history

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]
'''

Example: model checkpoints

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')

'''
saves the model weights after each epoch if the validation loss decreased
'''
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])