Выберите оптимальное количество эпох для обучения нейронной сети в Керасе

Опубликовано: 21 Июля, 2021

Одной из критических проблем при обучении нейронной сети на выборочных данных является переобучение . Когда количество эпох, используемых для обучения модели нейронной сети, больше, чем необходимо, обучающая модель изучает шаблоны, которые в значительной степени характерны для выборки данных. Это делает модель неспособной хорошо работать с новым набором данных. Эта модель дает высокую точность на обучающем наборе (данные выборки), но не может достичь хорошей точности на тестовом наборе. Другими словами, модель теряет способность к обобщению из-за переобучения обучающим данным.

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

keras.callbacks.callbacks.EarlyStopping ()

Любые значения потерь / точности можно отслеживать с помощью функции обратного вызова при ранней остановке. Если потери отслеживаются, обучение прекращается, когда наблюдается увеличение значений потерь. Или, если отслеживается точность, обучение прекращается, когда наблюдается снижение значений точности.

Syntax with default values:

keras.callbacks.callbacks.EarlyStopping(monitor=’val_loss’, min_delta=0, patience=0, verbose=0, mode=’auto’, baseline=None, restore_best_weights=False)

Understanding few important arguments:

  • monitor: The value to be monitored by the function should be assigned. It can be validation loss or validation accuracy.
  • mode: It is the mode in which change in the quantity monitored should be observed. This can be ‘min’ or ‘max’ or ‘auto’. When the monitored value is loss, its value is ‘min’. When the monitored value is accuracy, its value is ‘max’. When the mode is set is ‘auto’, the function automatically monitors with the suitable mode.
  • min_delta: The minimum value should be set for the change to be considered i.e., Change in the value being monitored should be higher than ‘min_delta’ value.
  • patience: Patience is the number of epochs for the training to be continued after the first halt. The model waits for patience number of epochs for any improvement in the model.
  • verbose: Verbose is an integer value-0, 1 or 2. This value is to select the way in which the progress is displayed while training.
    • Verbose = 0: Silent mode-Nothing is displayed in this mode.
    • Verbose = 1: A bar depicting the progress of training is displayed.
    • Verbose = 2: In this mode, one line per epoch, showing the progress of training per epoch is displayed.
  • restore_best_weights: This is a boolean value. True value restores the weights which are optimal.

Поиск оптимального количества эпох, чтобы избежать переобучения по набору данных MNIST.

Шаг 1. Загрузка набора данных и предварительная обработка




import keras
from keras.utils.np_utils import to_categorical
from keras.datasets import mnist
# Loading data
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# Reshaping data-Adding number of channels as 1 (Grayscale images)
train_images = train_images.reshape((train_images.shape[ 0 ],
train_images.shape[ 1 ],
train_images.shape[ 2 ], 1 ))
test_images = test_images.reshape((test_images.shape[ 0 ],
test_images.shape[ 1 ],
test_images.shape[ 2 ], 1 ))
# Scaling down pixel values
train_images = train_images.astype( 'float32' ) / 255
test_images = test_images.astype( 'float32' ) / 255
# Encoding labels to a binary class matrix
y_train = to_categorical(train_labels)
y_test = to_categorical(test_labels)

Шаг 2: построение модели CNN




from import models keras
from layers import keras
model = models.Sequential()
model.add(layers.Conv2D( 32 , ( 3 , 3 ), activation = "relu" ,
input_shape = ( 28 , 28 , 1 )))
model.add(layers.MaxPooling2D( 2 , 2 ))
model.add(layers.Conv2D( 64 , ( 3 , 3 ), activation = "relu" ))
model.add(layers.MaxPooling2D( 2 , 2 ))
model.add(layers.Flatten())
model.add(layers.Dense( 64 , activation = "relu" ))
model.add(layers.Dense( 10 , activation = "softmax" ))
model.summary()

Выход: Краткое изложение модели.


Шаг 4: Компиляция модели с оптимизатором RMSprop, категориальной функцией кросс-энтропии потерь и точностью как метрикой успеха




model. compile (optimizer = "rmsprop" , loss = "categorical_crossentropy" ,
metrics = [ 'accuracy' ])

Шаг 5: Создание набора проверки и обучающего набора путем разделения текущего обучающего набора




val_images = train_images[:10000]
partial_images = train_images[10000:]
val_labels = y_train[:10000]
partial_labels = y_train[10000:]

Шаг 6. Инициализация обратного вызова для ранней остановки и обучение модели.




callbacks import from keras
earlystopping = callbacks.EarlyStopping(monitor = "val_loss" ,
mode = "min" , patience = 5 ,
restore_best_weights = True )
history = model.fit(partial_images, partial_labels, batch_size = 128 ,
epochs = 25 , validation_data = (val_images, val_labels),
callbacks = [earlystopping])

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

Наблюдение за значениями потерь без использования функции обратного вызова Early Stopping:
Обучите модель до 25 эпох и нанесите на график значения потерь при обучении и значений потерь при проверке в зависимости от количества эпох. Сюжет выглядит так:

Вывод:
По мере того, как количество эпох превышает 11, потери обучающего набора уменьшаются и становятся почти нулевыми. Принимая во внимание, что потери при проверке возрастают, что свидетельствует о переобучении модели на обучающих данных.

Рекомендации:

  • https://keras.io/callbacks/
  • https://keras.io/datasets/

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.