Как добавить L2 Regularization к ResNet50? Как решить проблему переоснащения?

  1. Загрузка модели ResNet и добавление L2 Regularization:
resnet_base = ResNet50(weights='imagenet', include_top=False, input_shape=(224,224,3))
alpha = 1e-5
for layer in resnet_base.layers:
  if isinstance(layer, keras.layers.Conv2D) or isinstance(layer, keras.layers.Dense):
    layer.add_loss(keras.regularizers.l2(alpha)(layer.kernel))
  if hasattr(layer, 'bias_regularizer') and layer.use_bias:
    layer.add_loss(keras.regularizers.l2(alpha)(layer.bias))
  1. Добавляем слой FC поверх базы ResNet:
model = models.Sequential()
model.add(resnet_base)
model.add(layers.AveragePooling2D())
model.add(layers.Flatten())
model.add(layers.Dense(128, activation= 'relu', kernel_regularizer=keras.regularizers.l2(alpha)))
model.add(layers.Dropout(0.6))
model.add(layers.Dense(8, activation = 'softmax', kernel_regularizer=keras.regularizers.l2(alpha)))
model.summary()
  1. Замораживание слоев ResNet для разогрева слоя FC:
for layer in resnet_base.layers[:]:
  layer.trainable = False
model.compile(optimizer = SGD(learning_rate = 0.0001, momentum = 0.9, nesterov = False), loss='categorical_crossentropy', metrics=['accuracy'])
batch_size = 32
history = model.fit(train_generator,
                             steps_per_epoch=14206//batch_size, #14206 - training samples
                             epochs=5,
                             validation_data=validation_generator,
                             validation_steps=3546//batch_size) #3546 - validation samples

введите описание изображения здесь 4. Разморозка некоторых слоев базы ResNet и повторное обучение модели:

for layer in resnet_base.layers[:165]:
  layer.trainable = False
for layer in resnet_base.layers[165:]:
  layer.trainable = True
model.compile(optimizer = SGD(learning_rate = 0.0001, momentum = 0.9, nesterov = False),
              loss='categorical_crossentropy',
             metrics=['accuracy'])
nepochs=150
history = model.fit(train_generator,
                             steps_per_epoch=14206//batch_size, #14206 - training samples
                             epochs=nepochs,
                             validation_data=validation_generator,
                             validation_steps=3546//batch_size) #3546 - validation samples

введите здесь описание изображения При всем этом я не могу решить проблему переобучения. Я увеличил обучающие данные и использовал функцию preprocess_input как для обучения, так и для набора данных проверки. Я выполнил инструкции, представленные здесь: https://jricheimer.github.io/keras/2019/02/06/keras-hack-1/ для реализации регуляризации L2.


person Japesh Methuku    schedule 07.06.2020    source источник
comment
Можете ли вы добавить некоторые детали изображения и графики потери / точности?   -  person Zabir Al Nazi    schedule 08.06.2020
comment
Я добавил изображения по запросу. Надеюсь, это поможет.   -  person Japesh Methuku    schedule 08.06.2020


Ответы (2)


  • Используйте Global Pooling и попробуйте полностью избавиться от слоя Fully connected.
model = models.Sequential()
model.add(resnet_base)
model.add(layers.GlobalAveragePooling2D())
model.add(layers.Dense(8, activation = 'softmax')
model.summary()
  • Не используйте регуляризацию в последнем слое.

  • Попробуйте тренироваться на меньшее количество эпох или используйте EarlyStopping.

https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping

  • Используйте библиотеку дополнений для увеличения обучающих выборок.

https://github.com/mdbloice/Augmentor

person Zabir Al Nazi    schedule 07.06.2020
comment
Я действительно использовал обратные вызовы: ModelCheckpoint, EarlyStopping. Я хотел знать, правильно ли я реализовал Регуляризацию L2. Не могли бы вы это прокомментировать? Не могли бы вы объяснить необходимость использования Augmentor по вашему выбору, хотя я уже использовал ImageDataGenerator () от Keras. - person Japesh Methuku; 08.06.2020
comment
Ваши показатели не предполагают серьезного переоснащения. Нет, как я уже сказал, последний слой не должен иметь регуляризации, насколько мне известно. Вы можете попробовать увеличить альфу. Также попробуйте Global Pooling. - person Zabir Al Nazi; 08.06.2020
comment
Модель очень плохо работает на невидимых данных и в условиях дикой природы. - person Japesh Methuku; 08.06.2020
comment
Это нормально для любой модели, вы не можете ожидать, что ваша модель будет работать с любым распределением данных. Ваши проверочные метрики хороши, поэтому ваша модель, скорее всего, не переоснащается. Что касается набора тестов, не используйте набор тестов, который сильно отличается от данных обучения. - person Zabir Al Nazi; 08.06.2020
comment
Можете ли вы добавить несколько примеров обучающих и тестовых данных, как я предлагал изначально? - person Zabir Al Nazi; 08.06.2020

По-видимому, это неправильный способ добавлять регуляризацию предварительно обученных моделей. Необходимо выполнить несколько дополнительных шагов, см. Здесь: https://sthalles.github.io/keras-regularizer/

person maggle    schedule 16.01.2021