基于 AUC 的提前停止
Early stopping based on AUC
我是 ML 的新手,目前正在使用 tensorflow 和 keras 在 python 中实现一个简单的 3D CNN。我想根据 AUC 进行优化,也想使用早期 stopping/save AUC 分数方面最好的网络。为此,我一直在使用 tensorflow 的 AUC 函数,如下所示,它在训练中效果很好。但是,hdf5 文件未保存(尽管检查点 save_best_only=True),因此我无法获得评估的最佳权重。
以下是相关的代码行:
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.Adam(lr=lr),
metrics=[tf.keras.metrics.AUC()])
model.load_weights(path_weights)
filepath = mypath
check = tf.keras.callbacks.ModelCheckpoint(filepath, monitor=tf.keras.metrics.AUC(), save_best_only=True,
mode='auto')
earlyStopping = tf.keras.callbacks.EarlyStopping(monitor=tf.keras.metrics.AUC(), patience=hyperparams['pat'],mode='auto')
history = model.fit(X_trn, y_trn,
batch_size=bs,
epochs=n_epochs,
verbose=1,
callbacks=[check, earlyStopping],
validation_data=(X_val, y_val),
shuffle=True)
有趣的是,如果我只在提前停止和检查点更改monitor='val_loss'(而不是model.compile中的'metrics'),hdf5文件被保存但显然给出了最好的结果在验证损失方面。我也尝试过使用 mode='max' 但问题是一样的。
非常感谢您的建议,或任何其他关于如何解决此问题的建设性想法。
事实证明,即使你添加了一个非关键字metric,当你想要监控它时,仍然需要使用它的handle来引用in。在您的情况下,您可以这样做:
auc = tf.keras.metrics.AUC() # instantiate it here to have a shorter handle
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.Adam(lr=lr),
metrics=[auc])
...
check = tf.keras.callbacks.ModelCheckpoint(filepath,
monitor='auc', # even use the generated handle for monitoring the training AUC
save_best_only=True,
mode='max') # determine better models according to "max" AUC.
如果你想监控验证AUC(这更有意义),只需在句柄的开头添加val_
:
check = tf.keras.callbacks.ModelCheckpoint(filepath,
monitor='val_auc', # validation AUC
save_best_only=True,
mode='max')
另一个问题是您的 ModelCheckpoint 正在根据 最小值 AUC 而不是您想要的最大值来保存权重。
这可以通过设置 mode='max'
来改变。
mode='auto'
是做什么的?
此设置实质上检查监视器的参数是否包含 'acc'
并将其设置为最大值。在任何其他情况下,它设置使用 mode='min'
,这就是您的情况。
你可以确认一下here
Djib2011 的回答应该可以解决你的问题。我只是想解决提前停止的使用问题。通常这用于在过度拟合开始导致损失增加时停止训练。我认为直接解决过拟合问题更有效,这应该能让你获得更低的损失。您没有列出您的模型,因此不清楚如何解决过度拟合问题,但一些简单的指导原则如下。如果模型顶部有多个密集隐藏层,请删除其中的大部分,只保留最后的顶部密集层。模型越复杂,越容易过拟合。如果这导致训练精度降低,则保留这些层但添加 dropout 层。您也可以尝试在隐藏的密集层中使用正则化。我还发现使用回调 ReduceLROnPlateau 是有益的。设置它来监控AUC,如果它不能提高就降低学习率。
我是 ML 的新手,目前正在使用 tensorflow 和 keras 在 python 中实现一个简单的 3D CNN。我想根据 AUC 进行优化,也想使用早期 stopping/save AUC 分数方面最好的网络。为此,我一直在使用 tensorflow 的 AUC 函数,如下所示,它在训练中效果很好。但是,hdf5 文件未保存(尽管检查点 save_best_only=True),因此我无法获得评估的最佳权重。
以下是相关的代码行:
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.Adam(lr=lr),
metrics=[tf.keras.metrics.AUC()])
model.load_weights(path_weights)
filepath = mypath
check = tf.keras.callbacks.ModelCheckpoint(filepath, monitor=tf.keras.metrics.AUC(), save_best_only=True,
mode='auto')
earlyStopping = tf.keras.callbacks.EarlyStopping(monitor=tf.keras.metrics.AUC(), patience=hyperparams['pat'],mode='auto')
history = model.fit(X_trn, y_trn,
batch_size=bs,
epochs=n_epochs,
verbose=1,
callbacks=[check, earlyStopping],
validation_data=(X_val, y_val),
shuffle=True)
有趣的是,如果我只在提前停止和检查点更改monitor='val_loss'(而不是model.compile中的'metrics'),hdf5文件被保存但显然给出了最好的结果在验证损失方面。我也尝试过使用 mode='max' 但问题是一样的。 非常感谢您的建议,或任何其他关于如何解决此问题的建设性想法。
事实证明,即使你添加了一个非关键字metric,当你想要监控它时,仍然需要使用它的handle来引用in。在您的情况下,您可以这样做:
auc = tf.keras.metrics.AUC() # instantiate it here to have a shorter handle
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.Adam(lr=lr),
metrics=[auc])
...
check = tf.keras.callbacks.ModelCheckpoint(filepath,
monitor='auc', # even use the generated handle for monitoring the training AUC
save_best_only=True,
mode='max') # determine better models according to "max" AUC.
如果你想监控验证AUC(这更有意义),只需在句柄的开头添加val_
:
check = tf.keras.callbacks.ModelCheckpoint(filepath,
monitor='val_auc', # validation AUC
save_best_only=True,
mode='max')
另一个问题是您的 ModelCheckpoint 正在根据 最小值 AUC 而不是您想要的最大值来保存权重。
这可以通过设置 mode='max'
来改变。
mode='auto'
是做什么的?
此设置实质上检查监视器的参数是否包含 'acc'
并将其设置为最大值。在任何其他情况下,它设置使用 mode='min'
,这就是您的情况。
你可以确认一下here
Djib2011 的回答应该可以解决你的问题。我只是想解决提前停止的使用问题。通常这用于在过度拟合开始导致损失增加时停止训练。我认为直接解决过拟合问题更有效,这应该能让你获得更低的损失。您没有列出您的模型,因此不清楚如何解决过度拟合问题,但一些简单的指导原则如下。如果模型顶部有多个密集隐藏层,请删除其中的大部分,只保留最后的顶部密集层。模型越复杂,越容易过拟合。如果这导致训练精度降低,则保留这些层但添加 dropout 层。您也可以尝试在隐藏的密集层中使用正则化。我还发现使用回调 ReduceLROnPlateau 是有益的。设置它来监控AUC,如果它不能提高就降低学习率。