小白入门深度学习 | 第六篇:TensorFlow2 回调极速入门
Posted K同学啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白入门深度学习 | 第六篇:TensorFlow2 回调极速入门相关的知识,希望对你有一定的参考价值。
- 作者:K同学啊
- 本文选自:《小白入门深度学习》
- 配套实例教程:《深度学习100例》
什么是 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()
以上是关于小白入门深度学习 | 第六篇:TensorFlow2 回调极速入门的主要内容,如果未能解决你的问题,请参考以下文章