現在、次のコードを使用しています。
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/ しかし、トレーニングプロセスを停止する方法は見つかりませんでした。アドバイスが必要です。
答えを見つけました。 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未満の絶対変化は、改善なしとしてカウントされます。
1つの解決策は、forループ内でmodel.fit(nb_Epoch=1, ...)
を呼び出すことです。その後、forループ内にbreakステートメントを配置し、他の任意のカスタム制御フローを実行できます。
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