小白入门深度学习 | 第六篇:TensorFlow2 回调极速入门

Posted K同学啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白入门深度学习 | 第六篇:TensorFlow2 回调极速入门相关的知识,希望对你有一定的参考价值。

什么是 Tensorflow 回调?

Tensorflow 回调是在训练深度学习模型时,在特定时刻执行的某个函数或代码块。

在深度学习模型的训练过程中,随着模型变得越来越复杂,训练时间也显着增加。因此,模型通常需要花费十几个小时甚至更长的时间来训练我们的模型,在这个过程中我们希望可以监控,以及在特定的时候执行特定的操作,这时候就可以使用回调功能。

如何使用回调?

  • 第一步:定义回调
  • 第二步:在调用 model.fit() 时传递回调
# 设置动态学习率
annealer = LearningRateScheduler(lambda x: 1e-3 * 0.99 ** (x+NO_EPOCHS))

# 设置早停
earlystopper = EarlyStopping(monitor='loss', patience=PATIENCE, verbose=VERBOSE)

# 设置检查点
checkpointer = ModelCheckpoint('best_model.h5',
                                monitor='val_accuracy',
                                verbose=VERBOSE,
                                save_best_only=True,
                                save_weights_only=True)
train_model  = model.fit(train_ds,
                  epochs=NO_EPOCHS,
                  verbose=1,
                  validation_data=val_ds,
                  callbacks=[earlystopper, checkpointer, annealer])

我在 深度学习100例 | 第26天-卷积神经网络(CNN):乳腺癌识别 这篇文章中通过实战案例详细介绍了如何使用回调。

如何设置早停?

我们的深度学习模型训练周期都是特别长的,我们通常无法做到认为的实时监控,且模型经常会发生过拟合、训练精度无法有效提升等等问题,在这个时候我们可以设置一个早停。

如果指标增加到某个范围以上,我们可以停止训练以防止过度拟合。EarlyStopping 回调允许我们做到这一点。

tf.keras.callbacks.EarlyStopping(
    monitor='val_loss', min_delta=0, patience=0, verbose=0,
    mode='auto', baseline=None, restore_best_weights=False
)
  • monitor:你在训练时要监视的指标
  • min_delta:你要考虑作为对前一个时期的改进的指标的最小变化量
  • patience:你等待指标等待的时期数。否则,你将停止训练。
  • verbose:0:不打印任何内容,1:显示进度条,2:仅打印时期号
  • mode
    • “auto” – 尝试从给定的指标中自动检测行为
    • “min” – 如果指标停止下降,则停止训练
    • “max” – 如果指标停止增加,则停止训练

示例:

# 设置早停
earlystopper = EarlyStopping(monitor='loss', patience=PATIENCE, verbose=VERBOSE)

Lambda回调

这个回调函数用于在训练过程中的特定时间调用某些 lambda 函数。

tf.keras.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, **kwargs
)

参数详解:

  • on_epoch_begin:在每个时期开始时调用该函数。
  • on_epoch_begin:在每个时期结束时调用该函数。
  • on_batch_begin:在每批开始时调用该函数。
  • on_batch_end:在每批结束时调用该函数。
  • on_train_begin:模型开始训练时调用该函数
  • on_train_end:模型训练完成时调用

示例:

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

动态学习率

训练过程中最常见的任务之一是改变学习率。通常,随着模型接近损失最小值(最佳拟合),我们逐渐开始降低学习率以获得更好的收敛性。

让我们看一个简单的例子,我们希望每 个 epoch 将学习率降低 1%。这里我们需要向 schedule 函数传递一个参数,该参数指定学习率变化的逻辑。

示例:

# 设置动态学习率
annealer = LearningRateScheduler(lambda x: 1e-3 * 0.99 ** x)

train_model  = model.fit(train_ds,
                  epochs=NO_EPOCHS,
                  verbose=1,
                  validation_data=val_ds,
                  callbacks=[earlystopper, checkpointer, annealer])

模型检查点

我们使用这个回调来以不同的频率保存我们的模型。这允许我们在中间步骤保存权重,以便在需要时我们可以稍后加载权重。

tf.keras.callbacks.ModelCheckpoint(
    filepath, monitor='val_loss', verbose=0, save_best_only=False,
    save_weights_only=False, mode='auto', save_freq='epoch',
    options=None, **kwargs
)

关键参数:

  • filepath:模型所在的位置
  • monitor:要监视的度量
  • save_best_only:True,仅保存最好的模型,False,保存所有的模型时,指标改善
  • mode:min, max 或 auto
  • save_weights_only:False,仅保存模型权重, True,同时保存模型权重和模型架构

示例:

checkpointer = ModelCheckpoint('best_model.h5',
                                monitor='val_accuracy',
                                verbose=VERBOSE,
                                save_best_only=True,
                                save_weights_only=True)

学习率降低 LROnPlateau

当某项指标停止改进时,降低学习率。

tf.keras.callbacks.ReduceLROnPlateau(
    monitor='val_loss', factor=0.1, patience=10, verbose=0,
    mode='auto', min_delta=0.0001, cooldown=0, min_lr=0, **kwargs
)
  • monitor:要监视的度量
  • factor:降低学习率的系数。new_lr = lr * factor.
  • min_delta:衡量新的最佳状态的阈值,只关注重大变化
  • cooldown:等待 LR 减少的 epoch 数
  • min_lr:学习率不能低于该最小值

终止OnNaN

当任何损失变为 NaN 时,此回调将停止训练

tf.keras.callbacks.TerminateOnNaN()
👇🏻 扫一扫下方二维码,获取7900+本电子书👇🏻

以上是关于小白入门深度学习 | 第六篇:TensorFlow2 回调极速入门的主要内容,如果未能解决你的问题,请参考以下文章

小白入门深度学习 | 第一篇:配置深度学习环境

Pytorch深度学习50篇·······第六篇:常见损失函数篇-----BCELoss及其变种

小白入门深度学习 | 第三篇:深度学习初体验

小白入门深度学习 | 第一篇:配置深度学习环境

第六篇:Feedforward Networks 前向网络

扫盲记-第六篇--Normalization