web-dev-qa-db-ja.com

損失値に基づいて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エポック改善しなかった場合、Kerasにトレーニングを停止するよう指示します。しかし、損失が一定の「THR」より小さくなった後、トレーニングを停止します。

if val_loss < THR:
    break

ドキュメントには、独自のコールバックを作成する可能性があります: http://keras.io/callbacks/ しかし、トレーニングプロセスを停止する方法は見つかりませんでした。アドバイスが必要です。

66
ZFTurbo

答えを見つけました。 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)
66
ZFTurbo

Keras.callbacks.EarlyStoppingコールバックにはmin_delta引数があります。 Kerasドキュメントから:

min_delta:改善として適格となる監視対象の量の最小変化、つまりmin_delta未満の絶対変化は、改善なしとしてカウントされます。

23
devin

1つの解決策は、forループ内でmodel.fit(nb_Epoch=1, ...)を呼び出すことです。その後、forループ内にbreakステートメントを配置し、他の任意のカスタム制御フローを実行できます。

11
1''

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
1
Rushin Tilva