Tensorflow 基于AUC的早期停止

Tensorflow 基于AUC的早期停止,tensorflow,keras,hdf5,auc,early-stopping,Tensorflow,Keras,Hdf5,Auc,Early Stopping,我是ML的新手,目前正在使用tensorflow和keras用python实现一个简单的3D CNN。我希望基于AUC进行优化,并且希望在AUC分数方面使用提前停止/保存最佳网络。我一直在使用tensorflow的AUC函数,如下所示,它在培训中效果良好。但是,hdf5文件没有保存(尽管检查点save_best_only=True),因此我无法获得评估的最佳权重 以下是相关代码行: model.compile(loss='binary_crossentropy', o

我是ML的新手,目前正在使用tensorflow和keras用python实现一个简单的3D CNN。我希望基于AUC进行优化,并且希望在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)
有趣的是,如果我只在早期停止和检查点(而不是model.compile中的“metrics”)中更改monitor='val_loss',hdf5文件将被保存,但显然会在验证丢失方面给出最好的结果。我也尝试过使用mode='max',但问题是相同的。
我非常感谢您的建议或任何其他解决此问题的建设性想法。

结果表明,即使您添加了非关键字度量,您仍然需要在希望监视它时使用其句柄来引用。在您的情况下,您可以这样做:

auc=tf.keras.metrics.auc()
model.compile(loss='binary\u crossentropy',
优化器=keras.optimizers.Adam(lr=lr),
指标=[auc])
...
check=tf.keras.callbacks.ModelCheckpoint(文件路径,
monitor='auc',#甚至使用生成的句柄来监视训练auc
save_best_only=True,
mode='max')#根据“max”AUC确定更好的型号。
如果您想监控验证AUC(这更有意义),只需在句柄的开头添加
val\uu

check=tf.keras.callbacks.ModelCheckpoint(文件路径,
监视器='val_auc',#验证auc
save_best_only=True,
mode='max')
另一个问题是,ModelCheckpoint是基于最小值而不是所需的最大值来保存权重的

这可以通过设置
mode='max'
来更改


mode='auto'
做什么

此设置主要检查监视器的参数是否包含
'acc'
,并将其设置为max。在任何其他情况下,它设置使用
mode='min'
,这就是您的情况


您可以确认这一点,Djib2011发布的答案应该可以解决您的问题。我只是想解决提前停车的问题。通常,这用于在过度装配开始导致损耗增加时停止训练。我认为直接解决过度装修问题更有效,这将使您能够实现更低的损失。您没有列出您的模型,因此不清楚如何解决过度拟合问题,但以下是一些简单的指导原则。如果在模型顶部有几个密集的隐藏层,请删除其中的大部分,并只保留最后一个顶部密集层。模型越复杂,越容易过度拟合。如果这导致较低的训练精度,则保留层,但添加退出层。还可以尝试在隐藏的密集层中使用正则化。我还发现使用回调函数reducelRon是有益的。将其设置为监控AUC,如果无法提高,则降低学习率。

我以前使用mode='max'进行过尝试,但不幸的是,这是相同的问题。也许巡演验证AUC没有提高?是的,这是def培训,并显示auc和损失,用于培训和验证data@Sarah2020原来您还需要稍微更改
监视器
参数。我更新了我的答案。啊哈!非常感谢,现在看起来很明显,但我只是没有想到这一点!它现在工作得很好:)嗨,Gerry P,非常感谢你的补充回答。事实上,我使用的是一个非常简单的辍学模型,但现在也在评估其他正则化方法。我一定会添加您建议的回调!