Development Tip

Keras에게 손실 값을 기반으로 훈련을 중지하도록 알리는 방법은 무엇입니까?

yourdevel 2020. 11. 11. 20:47
반응형

Keras에게 손실 값을 기반으로 훈련을 중지하도록 알리는 방법은 무엇입니까?


현재 다음 코드를 사용합니다.

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)

2 epoch 동안 손실이 개선되지 않으면 Keras에게 훈련을 중단하라고 지시합니다. 그러나 손실이 일정한 "THR"보다 작아지면 훈련을 중단하고 싶습니다.

if val_loss < THR:
    break

문서에서 직접 콜백을 만들 수있는 가능성이있는 것을 보았습니다 : http://keras.io/callbacks/ 하지만 훈련 과정을 중지하는 방법을 찾지 못했습니다. 조언이 필요합니다.


답을 찾았습니다. 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 미만의 절대 변경은 개선되지 않은 것으로 간주됩니다.


One solution is to call model.fit(nb_epoch=1, ...) inside a for loop, then you can put a break statement inside the for loop and do whatever other custom control flow you want.


I am bit late to answer XD. But I solved the same problem using custom callback.

In the following custom callback code assign THR with the value at which you want to stop training and add the callback to your model.

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

참고URL : https://stackoverflow.com/questions/37293642/how-to-tell-keras-stop-training-based-on-loss-value

반응형