Keras Callback EarlyStopping, сравнивающий потерю обучения и проверки
Я устанавливаю нейронную сеть в Python Keras.
Чтобы избежать переобучения, я бы хотел отслеживать потери при обучении / проверке и создавать правильный обратный вызов, который останавливает вычисления, когда потеря при обучении слишком много меньше потери при проверке.
Пример обратного вызова:
callback = [EarlyStopping(monitor='val_loss', value=45, verbose=0, mode='auto')]
Есть ли способ прекратить тренировку, когда потеря тренировки слишком мала по сравнению с потерей валидации?
заранее спасибо
1 ответ
Вы можете создать собственный класс обратного вызова для вашей цели.
Я создал тот, который должен соответствовать вашим потребностям:
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 эпох.
Это тебе помогает?