是否可以更改 Keras 中 Early Stopping 回调使用的指标?

数据挖掘 机器学习 神经网络 深度学习 喀拉斯
2021-09-23 23:07:39

在 Keras 中使用提前停止回调时,当某些指标(通常是验证损失)没有增加时,训练会停止。有没有办法使用其他指标(如精度、召回或 f 度量)来代替验证损失?

到目前为止,我看到的所有示例都与此类似:

callbacks.EarlyStopping(monitor='val_loss', patience=5, verbose=0, mode='auto')
2个回答

您可以使用在编译模型时指定的任何度量函数。

假设您有以下度量函数:

def my_metric(y_true, y_pred):
     return some_metric_computation(y_true, y_pred)

这个函数的唯一要求是它接受真实的 y 和预测的 y。

当您编译模型时,您指定此指标,类似于您指定内置指标(如“准确性”)的方式:

model.compile(metrics=['accuracy', my_metric], ...)

请注意,我们使用的函数名称 my_metric 不带“ ”(与“准确性”中的构建相反)。

然后,如果您定义 EarlyStopping,只需使用函数的名称(这次使用 ''):

EarlyStopping(monitor='my_metric', mode='min')

确保指定模式(如果越低越好,则越小,越高越好,则越大)。

您可以像使用任何内置指标一样使用它。这可能也适用于其他回调,如 ModelCheckpoint(但我没有测试过)。在内部,Keras 只是使用函数名称将新指标添加到此模型可用的指标列表中。

如果您在 model.fit(...) 中指定用于验证的数据,那么您也可以使用“val_my_metric”将其用于 EarlyStopping。

当然,只需创建自己的!

class EarlyStopByF1(keras.callbacks.Callback):
    def __init__(self, value = 0, verbose = 0):
        super(keras.callbacks.Callback, self).__init__()
        self.value = value
        self.verbose = verbose


    def on_epoch_end(self, epoch, logs={}):
         predict = np.asarray(self.model.predict(self.validation_data[0]))
         target = self.validation_data[1]
         score = f1_score(target, prediction)
         if score > self.value:
            if self.verbose >0:
                print("Epoch %05d: early stopping Threshold" % epoch)
            self.model.stop_training = True


callbacks = [EarlyStopByF1(value = .90, verbose =1)]
model.fit(X, y, batch_size = 32, nb_epoch=nb_epoch, verbose = 1, 
validation_data(X_val,y_val), callbacks=callbacks)

我没有对此进行测试,但这应该是你如何去做的一般风格。如果它不起作用,请告诉我,我会在周末重试。我还假设您已经实现了自己的 f1 分数。如果不只是为 sklearn 导入。