でいただきありがとうございます。
私はあなたのニーズに対応していなければならないものを作成している:私はtrain_loss
とvalidation_loss
の比が一定比しきい値以下になった場合、あなたが停止したかったことを解釈する自由を取った
class CustomEarlyStopping(Callback):
def __init__(self, ratio=0.0,
patience=0, verbose=0):
super(EarlyStopping, self).__init__()
self.ratio = ratio
self.patience = patience
self.verbose = verbose
self.wait = 0
self.stopped_epoch = 0
self.monitor_op = np.greater
def on_train_begin(self, logs=None):
self.wait = 0 # Allow instances to be re-used
def on_epoch_end(self, epoch, logs=None):
current_val = logs.get('val_loss')
current_train = logs.get('loss')
if current_val is None:
warnings.warn('Early stopping requires %s available!' %
(self.monitor), RuntimeWarning)
# If ratio current_loss/current_val_loss > self.ratio
if self.monitor_op(np.divide(current_train,current_val),self.ratio):
self.wait = 0
else:
if self.wait >= self.patience:
self.stopped_epoch = epoch
self.model.stop_training = True
self.wait += 1
def on_train_end(self, logs=None):
if self.stopped_epoch > 0 and self.verbose > 0:
print('Epoch %05d: early stopping' % (self.stopped_epoch))
。この比率の引数は、0.0
と1.0
の間にある必要があります。しかし、1.0
は、妥当性の喪失と訓練の損失が訓練の始めに不安定な方法で大きく変動する可能性があるため、危険です。
忍耐強い議論を追加することができます。忍耐力の引数を追加すると、特定の回数のエポックにスレッショルドが崩れていないかどうかを確認できます。これを使用する
方法がexampeためです。この場合は
callbacks = [CustomEarlyStopping(ratio=0.5, patience=2, verbose=1),
... Other callbacks ...]
...
model.fit(..., callbacks=callbacks)
トレーニング損失が2つの以上のエポックのため0.5*val_loss
よりも低く留まる場合、それは停止します。
これは役立ちますか?
私が必要とするものは、本当にありがとう! –
非常に歓迎:)私はEarlyStoppingクラスのソースコードを取得し、それを適応させました。あなたのニーズに合わせて自由に編集できます。そこには魔法はありません! –