您可以创建一个自定义的回调类来满足您的需求。
我已经创建了一个应该符合您需要的类:
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
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 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))
我认为你想要在train_loss和validation_loss之间的比例达到一定阈值时停止。这个比值应该介于0.0和1.0之间,但是使用1.0会有风险,因为训练初期验证损失和训练损失可能会剧烈波动。你可以设置一个耐心参数,等待一定数量的周期来确定是否达到了您设定的阈值。例如,使用方式如下:
callbacks = [CustomEarlyStopping(ratio=0.5, patience=2, verbose=1),
... Other callbacks ...]
...
model.fit(..., callbacks=callbacks)
在这种情况下,如果训练损失低于0.5*val_loss
连续2个 epoch,程序将会停止运行。
这是否对您有帮助?
super(CustomEarlyStopping, self).__init__()
。 - Austin