我在 Python Keras中 安装了神经网络。
为了避免过度拟合,我想监视训练/验证损失并创建适当的回调,以在训练损失远小于验证损失时停止计算。
回调的示例是:
callback = [EarlyStopping(monitor='val_loss', value=45, verbose=0, mode='auto')]
当训练损失与验证损失相比过少时,有什么方法可以停止训练?
先感谢您
您可以根据需要创建自定义回调类。
我创建了一个应该符合您的需求的文件:
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))
我冒昧地解释,你想阻止如果之间的比例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个纪元,它将停止。
这对您有帮助吗?