【问题标题】:Early stopping based on AUC基于 AUC 的提前停止
【发布时间】:2020-11-18 20:57:55
【问题描述】:

我对 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)

有趣的是,如果我只在早期停止和检查点更改 monitor='val_loss'(而不是 model.compile 中的 'metrics'),hdf5 文件会被保存,但显然在验证损失方面给出了最好的结果。我也尝试过使用 mode='max' 但问题是一样的。 非常感谢您的建议,或任何其他建设性的想法如何解决这个问题。

【问题讨论】:

    标签: tensorflow keras hdf5 auc early-stopping


    【解决方案1】:

    Djib2011 发布的答案应该可以解决您的问题。我只是想解决提早停止的使用问题。通常,这用于在过度拟合开始导致损失增加时停止训练。我认为直接解决过度拟合问题会更有效,这应该可以让您实现更低的损失。您没有列出您的模型,因此不清楚如何解决过度拟合问题,但一些简单的指导方针如下。如果您在模型顶部有几个密集隐藏层,请删除其中大部分并保留最终的顶部密集层。模型越复杂,就越容易过度拟合。如果这导致训练精度降低,则保留这些层但添加 dropout 层。您也可以尝试在隐藏的密集层中使用正则化。我还发现使用回调 ReduceLROnPlateau 是有益的。设置它来监控 AUC 并在学习率没有提高时降低学习率。

    【讨论】:

    • 嗨,Gerry P,非常感谢您提供的额外答案。事实上,我正在使用一个非常简单的带有 dropout 的模型,但现在我也在评估其他正则化方法。我一定会添加你建议的回调!
    【解决方案2】:

    事实证明,即使你添加了一个非关键字指标,你仍然需要在你想要监控它的时候使用它的句柄来引用它。在您的情况下,您可以这样做:

    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

    【讨论】:

    • 我之前用 mode = 'max' 尝试过,但不幸的是它是同样的问题。
    • 也许巡回验证 AUC 没有提高?
    • 是的,它是定义训练并显示训练和验证数据的 auc 和损失
    • @Sarah2020 原来您还需要稍微更改monitor 参数。我更新了我的答案。
    • 啊哈!非常感谢,现在看起来很明显,但我只是没想到!它现在工作正常:)
    猜你喜欢
    • 2019-10-26
    • 2020-05-19
    • 2017-08-17
    • 2018-03-24
    • 2017-10-09
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    相关资源
    最近更新 更多