使用 model.fit() 训练模型是一个有效但通常耗时的过程。在此期间,您可能需要根据训练进度执行操作,例如定期保存模型、在性能停滞时提前停止,或者调整学习率。Keras 通过回调为此提供了一个清晰的机制。回调是可以传递给 model.fit() 方法的对象。它们由框架在训练过程中的特定时刻调用(例如,在每个训练周期开始或结束时,在处理批次数据之前或之后)。这让您可以自动完成那些原本需要手动干预或复杂自定义训练循环才能完成的任务。我们来查看 Keras 提供的部分最有用的内置回调。ModelCheckpoint:保存训练进度深度学习模型的训练可能需要数小时甚至数天。保存模型的当前状态非常重要,特别是当训练过程可能中断时。此外,您通常希望保存模型在验证集上表现最好的版本,而不一定是最后一个训练周期的版本,因为模型可能会开始过拟合。ModelCheckpoint 回调完成这项任务。您可以将其配置为定期保存模型(或仅保存其权重),或者在监控指标表现提升时保存。import keras # 定义回调 model_checkpoint_callback = keras.callbacks.ModelCheckpoint( filepath='best_model_epoch_{epoch:02d}_val_loss_{val_loss:.2f}.keras', # 模型保存路径 monitor='val_loss', # 监控指标 save_best_only=True, # 仅在监控指标表现提升时保存 save_weights_only=False, # 保存整个模型(架构 + 权重 + 优化器状态) mode='min', # 'min' 表示我们希望最小化验证损失 verbose=1 # 保存时打印消息 ) # 之后,在训练时: # history = model.fit(..., callbacks=[model_checkpoint_callback])参数说明:filepath:一个字符串,定义保存模型的路径和文件名。您可以包含格式化选项,例如 {epoch:02d} 来插入训练周期数(如果需要则补零),或 {val_loss:.2f} 来包含监控指标的值(格式化为两位小数)。常见的文件扩展名是 .keras(保存整个模型的首选格式)或 .weights.h5(如果 save_weights_only=True)。monitor:要监控的指标(例如,'val_loss'、'val_accuracy')。此指标必须从模型的编译步骤中可用,或在提供给 fit() 的验证数据上计算得出。save_best_only:如果为 True,回调仅在 monitor 指标相比之前的最好值有所提升时保存模型。如果为 False,它会在每个训练周期结束时保存模型。save_weights_only:如果为 True,仅保存模型的权重。如果为 False,则保存整个模型(架构、权重和优化器状态),让您以后可以完整地恢复训练。mode:决定了表现提升是意味着最小化('min')还是最大化('max')监控指标。它通常可以根据指标名称自动推断(例如,loss 表示 'min',accuracy 表示 'max'),但明确设置它是个好习惯。verbose:设置为 1 以在回调保存模型时查看消息。使用 ModelCheckpoint 并将 save_best_only 设置为 True,可确保您保留达到最佳验证性能的模型状态,避免在后续训练周期中出现过拟合。EarlyStopping:避免不必要的计算正如在过拟合章节中讨论的,模型在验证集上达到最佳性能后,可能会随着训练继续,性能开始下降。超过这个点继续训练会浪费计算资源,并可能导致模型泛化能力变差。EarlyStopping 回调监控一个指定指标,如果该指标在设定的训练周期数内停止提升,则自动停止训练过程。import keras # 定义回调 early_stopping_callback = keras.callbacks.EarlyStopping( monitor='val_loss', # 监控指标 patience=10, # 在指标没有提升的指定训练周期数后停止训练 min_delta=0.001, # 认定为提升的最小变化量 mode='min', # 'min' 表示我们希望最小化验证损失 restore_best_weights=True, # 将模型权重恢复到监控指标表现最佳的那个训练周期 verbose=1 # 停止时打印消息 ) # 之后,在训练时: # history = model.fit(..., callbacks=[early_stopping_callback])参数说明:monitor:要监控的指标,通常是验证指标,例如 'val_loss' 或 'val_accuracy'。patience:这是在停止训练之前,连续等待没有提升的训练周期数。例如,如果 patience=10,则如果监控指标连续 10 个训练周期没有提升,训练将停止。min_delta:监控量中认定为提升的最小变化量。这有助于避免因微小、不重要的波动而停止。例如,如果 monitor='val_loss' 且 min_delta=0.001,则小于 0.001 的下降将不被视为提升。mode:与 ModelCheckpoint 类似,根据所监控的指标指定 'min' 或 'max'。restore_best_weights:如果为 True,模型的权重将恢复到监控指标表现最佳的那个训练周期的权重。强烈推荐此设置,因为它确保您的最终模型状态与训练期间观察到的最佳性能相符,即使训练因 patience 设置而在几个训练周期后停止。verbose:设置为 1 以在回调停止训练时查看消息。EarlyStopping 是一种有价值的工具,通过在模型停止在验证数据上有效学习时停止训练,它既可以防止过拟合,又能节省计算时间。ReduceLROnPlateau:调整学习率有时,在训练过程中,模型在验证指标上的提升可能会减缓并进入平台期。当前的学习率可能过大,无法将权重微调到损失函数的更好最小值。在这种情况下,降低学习率可以帮助优化器采取更小的步长,并有可能脱离平台期。ReduceLROnPlateau 回调监控一个指标,并在给定数量的训练周期(patience)内没有提升时,按指定因子减小学习率。import keras # 定义回调 reduce_lr_callback = keras.callbacks.ReduceLROnPlateau( monitor='val_loss', # 监控指标 factor=0.2, # 学习率将按此因子缩减。新学习率 = 当前学习率 * 因子 patience=5, # 在指标没有提升的指定训练周期数后缩减学习率 min_lr=0.00001, # 学习率的下限 mode='min', # 'min' 表示我们希望最小化验证损失 verbose=1 # 缩减学习率时打印消息 ) # 之后,在训练时: # history = model.fit(..., callbacks=[reduce_lr_callback])参数说明:monitor:其停滞会触发学习率缩减的指标。factor:学习率将按此因子缩减(例如,0.2 表示新学习率将是 current_lr * 0.2)。必须小于 1.0。patience:在没有提升的训练周期数之后,学习率将缩减。请注意,每次学习率缩减后,此 patience 计数都会重置。min_lr:学习率的下限。回调不会将学习率降至此值以下。min_delta:衡量新最佳值的阈值,以便只关注显著变化。mode:'min' 或 'max'。verbose:设置为 1 以在学习率缩减时查看消息。此回调允许采用动态学习率策略,适应训练过程中的动态变化,无需手动干预。使用多个回调您很少只使用一个回调。组合多个回调来管理训练过程的不同方面是常见做法。要使用多个回调,只需将回调对象列表传递给 model.fit() 中的 callbacks 参数。import keras # 实例化所有所需的回调 model_checkpoint_callback = keras.callbacks.ModelCheckpoint( filepath='best_model.keras', monitor='val_loss', save_best_only=True, mode='min' ) early_stopping_callback = keras.callbacks.EarlyStopping( monitor='val_loss', patience=15, mode='min', restore_best_weights=True ) reduce_lr_callback = keras.callbacks.ReduceLROnPlateau( monitor='val_loss', factor=0.1, patience=7, min_lr=0.00001, mode='min' ) # 创建回调列表 callback_list = [ model_checkpoint_callback, early_stopping_callback, reduce_lr_callback ] # 将列表传递给 model.fit() # history = model.fit( # x_train, y_train, # epochs=100, # batch_size=32, # validation_data=(x_val, y_val), # callbacks=callback_list # )在这个示例中,训练过程将:监控 val_loss。每当 val_loss 提升时,将整个模型保存到 best_model.keras(ModelCheckpoint)。如果 val_loss 连续 7 个训练周期没有提升,将学习率缩减 0.1 倍(ReduceLROnPlateau)。如果 val_loss 连续 15 个训练周期没有提升,则完全停止训练,并恢复最佳训练周期的权重(EarlyStopping)。其他回调和自定义Keras 包含其他内置回调,例如 TensorBoard(我们将在“TensorBoard 简介”章节中详细介绍)用于记录指标和可视化图表,以及 CSVLogger 用于将训练周期结果流式传输到 CSV 文件。此外,Keras 允许您通过继承 keras.callbacks.Callback 基类并重写 on_epoch_end、on_batch_begin 等方法来创建自己的自定义回调。这为在训练期间实现特定行为提供了很大的灵活性,尽管内置回调涵盖了大多数常见用途。通过有效使用 ModelCheckpoint、EarlyStopping 和 ReduceLROnPlateau 等回调,您可以显著改进您的训练流程,使其更有效率,并减少过拟合的倾向。它们是深度学习实际开发中不可或缺的工具。