在 Keras 中使用提前停止回调时,当某些指标(通常是验证损失)没有增加时,训练会停止。有没有办法使用其他指标(如精度、召回或 f 度量)来代替验证损失?
到目前为止,我看到的所有示例都与此类似:
callbacks.EarlyStopping(monitor='val_loss', patience=5, verbose=0, mode='auto')
在 Keras 中使用提前停止回调时,当某些指标(通常是验证损失)没有增加时,训练会停止。有没有办法使用其他指标(如精度、召回或 f 度量)来代替验证损失?
到目前为止,我看到的所有示例都与此类似:
callbacks.EarlyStopping(monitor='val_loss', patience=5, verbose=0, mode='auto')
您可以使用在编译模型时指定的任何度量函数。
假设您有以下度量函数:
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 导入。