Keras 中的回调

2025年6月17日 | 阅读时长11分钟

在训练任何机器学习模型时,实现效率、适应性和监控都是必不可少的。通过 Keras(一个高级神经网络 API),可以在训练、评估或推理过程中的指定点激活回调函数,从而实现对模型行为的动态控制。

Keras 回调函数是用于与训练过程交互的自定义实用程序。它们可用于保存模型检查点、调整学习率、记录指标,甚至在满足某些条件时提前停止。这些对于优化训练工作流程和防止过拟合以优化模型性能至关重要。

现在,为了更好地理解,我们将使用各种模型来创建自定义 Keras 回调函数,并对其进行测试。

导入库

输出

Callbacks in Keras

输出

 
(13400, 2)

模型

现在,我们将创建一个基本的神经网络模型

编写回调函数

要实现给定的回调函数,您需要编写一个自定义回调函数,以便在每个 epoch 结束时计算并打印微 F1 分数和 AUC 分数,而无需使用 tf.keras.metrics 进行这些计算。您还应该在验证准确率优于前一个 epoch 的每个 epoch 中保存模型。学习率衰减必须基于以下两个条件进行:- 如果前一个 epoch 的验证准确率下降,则学习率降低 10%。- 每第三个 epoch,学习率降低 5%。如果在训练过程中遇到任何 NaN 值(权重或损失),则立即停止训练。当验证准确率在最后两个 epoch 没有提高时,也应该停止训练。最后,使用 TensorBoard 跟踪和分析标量图和直方图;包括屏幕截图和观察结果以供评估。

CustomModelCheckPoint 是一个回调函数,可在训练期间当监控的指标(accuracy_val)提高时保存模型。它由基础路径和要监控的指标进行初始化。在训练开始时,会设置一个 history 字典来跟踪指标,并且最佳分数 self.best 初始化为负无穷。

在每个 epoch 结束时,它会检查 accuracy_val 是否在日志中;如果当前的 accuracy_val 优于之前最佳的,它会以包含 epoch 号码和 accuracy_val 的文件名保存模型。这确保了在训练期间保留最佳模型。

MetricTracker 回调函数用于在训练时计算和跟踪验证数据的附加指标,如 F1 分数和 AUC。会初始化一个 history 字典来存储损失、准确率和自定义分数等指标。在每个 epoch 结束时,它会对验证标签进行预测,通过辅助函数计算 F1 分数和 AUC,并记录结果。这种回调通过提供比标准指标更具信息性的模型性能详细信息,进一步增强了监控功能。

在训练过程中,`CustomLRScheduler` 根据两个标准动态修改学习率:每第三个 epoch 将学习率衰减 5%,如果当前 epoch 的验证准确率差于前一个 epoch,则将其降低 10%。通过将此回调与模型的优化器集成,该优化器实时更新学习率,确保对训练过程进行更好的控制以提高性能。

`EarlyStoppingAtDecreasingValidationScore` 回调函数在验证准确率在指定数量的连续 epoch(`patience`)内停止提高时停止训练。

`TerminateAtNaNLossOrWeights` 回调函数是一个自定义的TensorFlow 回调函数,如果损失或模型的任何权重变得无效(例如 `NaN`(非数字)或 `infinity`)则停止训练。它有一个 `on_epoch_end` 方法,在每个 epoch 结束时调用,以检查损失值和模型中的每个权重。如果其中任何一个为 `NaN` 或 `infinity`,则通过设置 `self.model.training_stop = True` 来停止训练。这可以防止模型继续使用可能导致性能不佳或不稳定的有问题的值进行训练。

使用自定义回调函数进行模型训练

我们将连同自定义回调函数一起训练我们的模型。

在 model-1 中,除输出层外,所有层都使用 tanh 激活函数;它使用带有动量的 SGD 作为优化器,并使用 RandomUniform(0, 1) 初始化器进行权重初始化。之后,应该分析输出和训练,以评估模型是否正确收敛,是否存在其他问题(如验证损失和准确率的平台期),以及整个设置是否能有效地提供最佳结果。

输出

Callbacks in Keras
Callbacks in Keras

Model-2 除最终输出层外,所有层均采用 ReLU 激活,使用带有动量的 SGD 作为优化器,并使用 RandomUniform(0, 1) 初始化器进行权重初始化。需要检查输出和训练过程,了解它在哪个阶段收敛,是否存在验证损失和准确率平台期等现象,以及这种设置如何有助于获得正确的结果。

输出

Callbacks in Keras
Callbacks in Keras

Model-3 除输出层外,所有层均使用 ReLU 激活函数,使用带有动量的 SGD 作为优化器,并使用 HeUniform() 作为权重初始化器。应该检查训练后的输出和训练过程,以估计模型的性能,包括验证损失和准确率的提高,以及这种配置相对于先前设置在实现更好收敛和最佳结果方面的整体有效性。

输出

Callbacks in Keras
Callbacks in Keras

Model-4 除输出层外,所有层均采用 ReLU 作为激活函数。Adam 用作优化器,HeNormal() 用作权重初始化器。训练后,必须检查输出和训练过程,以评估模型的性能。将观察到验证损失和准确率的提高,以及这种配置与先前模型相比在实现更好收敛和最佳结果方面的潜力。

输出

Callbacks in Keras
Callbacks in Keras

结果

Model-1:tanh 激活与统一随机初始化

  • tanh 激活和统一随机初始化组合会导致验证损失和准确率出现平台期,这表明这不是模型收敛的最佳设置。
  • 由于随机统一初始化,权重和偏差的变化是统一的,这可能是性能不佳的原因。
  • 使用统一随机初始化会使网络处于不太理想的初始状态,这意味着无法获得最优解,从而导致结果变差。

Model-2:ReLU 激活使用随机统一初始化

  • 与 Model-1 类似,ReLU 激活与随机统一初始化一起,也会导致验证损失和准确率曲线持平。
  • 同样,权重和偏差的变化是统一的,这无助于获得更好的性能。
  • 适当的初始化对于神经网络有效地找到损失函数的局部最小值至关重要。从不良的初始化开始可能会阻止模型达到全局最小值并获得最佳结果。

Model-3:ReLU 激活与 He 统一初始化

  • 与早期模型相比,ReLU 激活与统一初始化结合显示出更好的性能。验证损失和准确率正在提高,这意味着这种组合效果更好。
  • 权重和偏差的变化被认为更有利,即均值接近 0,方差非常小,这支持更好的学习和模型收敛。
  • 与之前的模型类似,初始化仍然很关键。He 统一初始化使网络从一个更有利的位置开始,这反过来又增加了收敛到最优解的机会。
  • 深度学习社区广泛推荐 ReLU 激活与 He 初始化(包括统一和标准)的组合,该模型的 L结果也与此一致。

Model-4:ReLU 激活与 He 标准初始化

  • 对于 ReLU 和 He 标准初始化,性能与 ReLU 和 He 统一初始化非常相似,在验证损失和准确率的提高方面表现出相似之处。
  • 权重和偏差的变化均值为 0,方差很小,确保了稳定的学习和更好的模型收敛初始化。