Нет повышения точности проверки (L eNet -5) даже с Dropout, L2 и другими данными - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь обучить L eNet 5 с 16 выходами на изображениях в оттенках серого размером (30x30x1). Я пробовал с 12,800 образцами без выпадения и регуляризатора с использованием оптимизатора Adam в Keras и смог достичь 100% точности обучения после 400 эпох с размером пакета 100, тогда как точность проверки достигла максимума 65% с без выпадения и регуляризатора .

Я пробовал с увеличением данных, добавляя регуляризатор L2 и Dropout, но не сильно улучшал точность проверки, как показано, тогда как расхождение.

Не могли бы вы подсказать, как мне приступить к устранению этой проблемы переоборудования (afaik)?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Расширение отличных указателей, предоставленных jakub.

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

  2. Предположим, вы разделили данные на два набора и поместили их по следующим путям:

train_dir = '/ data / training'

validation_dir = '/ data / validation'

Первое, что нужно сделать на этом этапе, - разделить каждый пиксель на 255, чтобы они были повторно -масштабируется от 0 до 1. Вдобавок к этому обычно окупается увеличение данных с помощью различных преобразований, например сдвига, поворота, масштабирования, отражения и т. д. c, потому что это в некоторой степени обобщает модель. И то, и другое может быть достигнуто с помощью модуля ImageDataGenerator следующим образом:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Add our data-augmentation parameters to ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255.,
                                   rotation_range = 40,
                                   width_shift_range = 0.2,
                                   height_shift_range = 0.2,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

# Note that the validation data should not be augmented!
test_datagen = ImageDataGenerator( rescale = 1.0/255. )

# Flow training images in batches of 100 using train_datagen generator
train_generator = train_datagen.flow_from_directory(train_dir,
                                                    batch_size = 100,
                                                    class_mode = 'binary', 
                                                    target_size = (30, 30))     

# Flow validation images in batches of 100 using test_datagen generator
validation_generator =  test_datagen.flow_from_directory(validation_dir,
                                                          batch_size  = 100,
                                                          class_mode  = 'binary', 
                                                          target_size = (30, 30))
Теперь, обычно 100% точность обучающих данных означает, что либо функции довольно просты, либо модель переобладает. Может быть полезно создать обратный вызов, чтобы установить порог точности обучения. Проще говоря, обучение остановится, если точность обучения достигнет порогового значения. Мы можем установить его на 99%, как пример.

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

# Define a Callback class that stops training once accuracy reaches 98%
class MyCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}):
    if(logs.get('acc')>0.99):
      print("\nReached 99% accuracy so cancelling training!")
      self.model.stop_training = True

training_clbk = MyCallback()

# Define the early stopping Callback
early_stopper_clbk = tf.keras.callbacks.EarlyStopping(
    monitor="val_loss",
    min_delta=0,
    patience=0,
    verbose=0,
    mode="auto",
    baseline=None,
    restore_best_weights=False,
)

history = model.fit_generator(
      train_generator,
      epochs=100,
      validation_data=validation_generator,
      callbacks = [training_clbk, early_stopper_clbk],
      verbose=2)

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

0 голосов
/ 06 августа 2020

Вы можете попробовать несколько вещей:

  • Увеличьте частоту отсева, скажем, до 0,5
  • Прекратите обучение вашей модели раньше, чтобы предотвратить переобучение. Это можно сделать с помощью обратного вызова EarlyStopping.
  • Дополните данные тренировки, чтобы добавить шум. Теоретически это может помочь вашей модели изучить функции, которые имеют отношение к вашей проблеме, а не шум.
  • Подумайте, насколько ваши данные проверки похожи на данные обучения. Следует ли ожидать, что модель будет работать аналогичным образом с вашими данными проверки?
...