Проблема с обучением нейронных сетей заключается в выборе количества используемых эпох обучения. Слишком много эпох может привести к переобучению обучающего набора данных, а слишком малое - к неполноценной модели.

Ранняя остановка - это метод, который позволяет указать произвольно большое количество эпох обучения и остановить обучение, как только производительность модели перестанет улучшаться в наборе данных проверки.

Для этого требуется, чтобы разделение проверки было предоставлено функции fit () и обратному вызову EarlyStopping, чтобы указать показатель производительности, по которому будет отслеживаться производительность при разделении проверки.

model.fit(train_X, train_y, validation_split=0.3,callbacks=EarlyStopping(monitor=’val_loss’))

Это все, что нужно для простейшей формы ранней остановки. Обучение остановится, когда выбранный показатель производительности перестанет улучшаться. Чтобы определить эпоху обучения, в которой обучение было остановлено, аргумент «подробный» может быть установлен в 1. После остановки обратный вызов напечатает номер эпохи.

EarlyStopping(monitor=’val_loss’, verbose=1)

Часто первые признаки отсутствия улучшения могут быть не лучшим временем для прекращения тренировок. Это потому, что модель может немного ухудшиться, прежде чем станет намного лучше. Мы можем учесть это, добавив задержку к триггеру с точки зрения количества эпох, в которых мы не хотели бы видеть никаких улучшений. Это можно сделать, задав аргумент «терпение».

EarlyStopping(monitor=’val_loss’, mode=’min’, verbose=1, patience=50)
The exact amount of patience will vary between models and problems. there a rule of thumb to make it 10% of number of epoch.

Но когда мы проявим терпение, у нас возникнет проблема

Предположим: в нашем решении мы включили EarlyStopping(monitor='val_loss', patience=2) и хотели отслеживать потерю проверки в каждую эпоху, и после того, как потеря проверки не улучшилась после двух эпох, обучение прерывается. Однако, поскольку мы установили терпение = 2, мы получим не лучшую модель, а модель через две эпохи после лучшей модели.

Таким образом, требуется дополнительный обратный вызов, который сохранит лучшую модель, наблюдаемую во время обучения, для дальнейшего использования. Это обратный вызов ModelCheckpoint.

Мы можем настроить функции обратного вызова на раннюю остановку обучения и сохранить лучшую модель следующим образом:

Затем сохраненную модель можно загрузить и оценить в любое время, вызвав функцию load_model ().

from keras.models import load_model
saved_model = load_model('best_model.h5')
train_acc = saved_model.evaluate(trainX, trainy, verbose=0)
test_acc = saved_model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))

Https://medium.com/@upendravijay2/how-does-dropout-help-to-avoid-overfitting-in-neural-networks-91b90fd86b20