防止模型过拟合之提前终止(EarlyStopping)

目录

tf.keras.callbacks.EarlyStopping使用方法

tf.keras.callbacks.EarlyStopping使用示例


在训练数据集上拟合得过于完美,在测试数据上的表现可能会变差,即出现过拟合。如果在训练过程中,每训练一段时间,都观察一下模型在测试数据上的表现,并在测试集上的表现没有明显提升时终止训练,就可以得到一个在训练和测试数据上表现都比较好的模型。这就是提前终止方法,这种方法可以防止模型过拟合。

在tensorflow2中设置EarlyStopping回调函数就能完成,非常的简单方便。


tf.keras.callbacks.EarlyStopping使用方法

tf.keras.callbacks.EarlyStopping有这些参数

monitor='val_loss',
min_delta=0,
patience=0,
verbose=0,
mode='auto',
baseline=None,
restore_best_weights=False,
start_from_epoch=0

monitor是要被监视的值,比如在model.compile里面配置的损失函数、或者metrics里面配置的评价指标。

min_delta当被监视的值变化大于min_delta的时候,认为是有改进的。比如在测试数据上的损失函数值下降量的绝对值大于min_delta,则认为当前的模型和之前相比,是有改进的。

patience设置当迭代多少个epoch,发现模型仍然没有改进,就停止训练。

verbose可以设置为0或1,用于控制展示的log。为0时,没有log打印。为1时,当回调函数生效的时候,会打印一些相关的log。

mode设置模式,有'auto','min','max'三种。设置为min时,当被监视的值不再减小时停止。设置为max时,当被监视的值不再增大时停止。设置为auto时,会通过设置的监视值名称自行推断使用min或则max。

baseline设置被监视的值基线,当模型在达到基线的基础上不再提升时,训练终止。

restore_best_weights设置是否存储监视值指示的最佳模型参数。

start_from_epoch设置经过多少个epoch之后,开始监视是否有改进。一些模型在刚开始训练时,表现可能不是太好,经过几个epoch之后再监视模型的改进情况,可以避免因开始阶段模型表现不好导致的过早终止。比较新的版本中才有这个参数,比如2.11。


tf.keras.callbacks.EarlyStopping使用示例

我们以mnist数据集为例,展示tf.keras.callbacks.EarlyStopping的使用方法。创建一个简单的神经网络模型,在tf.keras.callbacks.EarlyStopping中,我们监视测试数据上的loss,当经过10个epoch,测试数据上的loss没有继续下降时终止训练。

import tensorflow as tf

# load dataset
(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()

# define model
model = tf.keras.Sequential(
    [
        tf.keras.layers.Flatten(input_shape=(28,28), name='flatten'),
        tf.keras.layers.Dense(units=128, activation='relu', name='dense_1'),
        tf.keras.layers.Dense(units=10, name='logits')
    ]
)

# compile model
model.compile(
    optimizer = tf.keras.optimizers.Adam(),
    loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics = [tf.keras.metrics.SparseCategoricalAccuracy()]
)

# set EarlyStopping callback
es_cb = tf.keras.callbacks.EarlyStopping(
    monitor = 'val_loss',
    patience = 10,
    verbose = 1,
    restore_best_weights = True
)

# train model without EarlyStopping callback
history = model.fit(
    x_train,
    y_train,
    validation_data = (x_test, y_test),
    epochs = 100
)

# train model with EarlyStopping callback
history_es = model.fit(
    x_train,
    y_train,
    validation_data = (x_test, y_test),
    epochs = 100,
    callbacks = [es_cb]
)

# 绘制loss的变化情况
import tensorflow_docs as tfdocs
import tensorflow_docs.plots
histories = {}
histories['noEarlyStopping'] = history
histories['EarlyStopping'] = history_es
plotter = tfdocs.plots.HistoryPlotter(metric='loss', smoothing_std = 10)
plotter.plot(histories)

'''
Restoring model weights from the end of the best epoch: 8.
'''

绘制不带提前终止和带提前终止的loss随epoch的变化情况,如下图所示。可以看到,迭代几个epoch之后,测试数据上的loss值开始回升。使用提前终止,可以避免出现模型过于完美地拟合训练数据,即loss值很低,而在测试数据上表现很差的情况。

防止模型过拟合之提前终止(EarlyStopping)_第1张图片

 从log上可以看到,使用tf.keras.callbacks.EarlyStopping, 在设置restore_best_weights=True的时候,程序会帮助保存在测试数据上最好的模型参数。

 

你可能感兴趣的:(tensorflow2使用,python,开发语言)