如何根据损失值告诉Keras停止训练?
conv-neural-network
keras
machine-learning
neural-network
4
0

目前,我使用以下代码:

callbacks = [
    EarlyStopping(monitor='val_loss', patience=2, verbose=0),
    ModelCheckpoint(kfold_weights_path, monitor='val_loss', save_best_only=True, verbose=0),
]
model.fit(X_train.astype('float32'), Y_train, batch_size=batch_size, nb_epoch=nb_epoch,
      shuffle=True, verbose=1, validation_data=(X_valid, Y_valid),
      callbacks=callbacks)

它告诉Keras,如果损失在2个时期内没有改善,就停止训练。但是我要在损失变得小于某个恒定的“ THR”后停止训练:

if val_loss < THR:
    break

我在文档中已经看到可以进行自己的回调: http : //keras.io/callbacks/但没有发现如何停止培训过程。我需要个建议。

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

我找到了答案。我调查了Keras的资源,并找到了EarlyStopping的代码。我基于此进行了自己的回调:

class EarlyStoppingByLossVal(Callback):
    def __init__(self, monitor='val_loss', value=0.00001, verbose=0):
        super(Callback, self).__init__()
        self.monitor = monitor
        self.value = value
        self.verbose = verbose

    def on_epoch_end(self, epoch, logs={}):
        current = logs.get(self.monitor)
        if current is None:
            warnings.warn("Early stopping requires %s available!" % self.monitor, RuntimeWarning)

        if current < self.value:
            if self.verbose > 0:
                print("Epoch %05d: early stopping THR" % epoch)
            self.model.stop_training = True

和用法:

callbacks = [
    EarlyStoppingByLossVal(monitor='val_loss', value=0.00001, verbose=1),
    # EarlyStopping(monitor='val_loss', patience=2, verbose=0),
    ModelCheckpoint(kfold_weights_path, monitor='val_loss', save_best_only=True, verbose=0),
]
model.fit(X_train.astype('float32'), Y_train, batch_size=batch_size, nb_epoch=nb_epoch,
      shuffle=True, verbose=1, validation_data=(X_valid, Y_valid),
      callbacks=callbacks)
收藏
评论

keras.callbacks.EarlyStopping回调确实具有min_delta参数。从Keras文档中:

min_delta:监视数量的最小变化(有资格作为改进),即,绝对变化小于min_delta的情况将不视为改进。

收藏
评论

我回答XD有点晚了。但是我使用自定义回调解决了相同的问题。

在以下自定义回调代码中,向THR分配您要停止训练的值,并将回调添加到模型中。

from keras.callbacks import Callback

class stopAtLossValue(Callback):

        def on_batch_end(self, batch, logs={}):
            THR = 0.03 #Assign THR with the value at which you want to stop training.
            if logs.get('loss') <= THR:
                 self.model.stop_training = True
收藏
评论

一种解决方案是在for循环内调用model.fit(nb_epoch=1, ...) ,然后可以将break语句放入for循环内,然后执行所需的其他任何自定义控制流。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号