Точность обучения CNN стабилизируется.

Вопрос или проблема

Я обучаю CNN с нуля для тегирования изображений. И мое обучение не движется никуда. Я надеялся, что кто-то сможет помочь мне выявить очевидную ошибку.

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

Мой датасет состоит из CSV, который выглядит так. Я выбрал этот формат, потому что планирую добавить больше тегов в датасет в будущем.

filename,face
img1.jpg,0
img2.jpg,1
...

… который я загружаю в датафрейм pandas с помощью load_csv(). Затем я создаю генератор для обучения.

datagen = ImageDataGenerator(validation_split=0.2)
train_generator = datagen.flow_from_dataframe(
    dataframe=df,
    directory=image_directory,
    x_col="filename",
    y_col=label_strings,
    subset="training",  # Укажите подмножество как обучение
    class_mode="raw",
    target_size=(270, 480),
    batch_size=32,
    shuffle=True
)

… и я также создаю генератор для валидации, используя аналогичные настройки.

Вот моя архитектура сети:

model = Sequential([
  layers.InputLayer(input_shape=(270, 480, 3)),

  # # аугментация данных,
  layers.RandomFlip("horizontal_and_vertical"),
  layers.RandomRotation(0.025),
  # предобработка
  layers.Rescaling(1./255),
  # выполняем работу
  layers.Conv2D(16, 3, padding='same'),
  layers.Activation("relu"),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, padding='same'),
  layers.Activation("relu"),
  layers.MaxPooling2D(),
  layers.Conv2D(64, 3, padding='same'),
  layers.Activation("relu"),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(256),
  layers.Activation("relu"),
  layers.Dense(256),
  layers.Activation("relu"),
  layers.Dense(num_classes),
  layers.Activation('sigmoid')
])

Затем я компилирую её следующим образом и обучаю на наборе, содержащем 2600 изображений:

opt = SGD(learning_rate=0.0001)
model.compile(optimizer=opt,
              loss="binary_crossentropy",
              metrics=['accuracy'])

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

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

Эффективность модели зависит от данных, но я вижу несколько проблем в вашем подходе, которые вы можете попробовать изменить:

  • нормализация – вы не использовали никакую нормализацию. Вы можете попробовать вставить слой BatchNormalization между вашими. Что касается активации ReLU, вероятно, нет разницы, если нормализация будет перед или после активации.
  • слишком много параметров и слишком мало изображений – вы написали, что используете 2600 входных данных (это, вероятно, немного), и, похоже, у вашей модели больше параметров, что мешает способности к обобщению в многих случаях. Если у вас нет больше данных, попробуйте уменьшить свою модель.
  • регуляризация – вы можете попробовать добавить слои Dropout.
  • глубина модели – попробуйте добавить один или два дополнительных слоя Conv2D, чтобы уменьшить размер изображения больше перед тем, как положить его в Dense слой. Эти Dense слои также, похоже, очень широкие.

Ответ или решение

После анализа вашей проблемы с обучением сверточной нейронной сети (CNN) для распознавания лиц в изображениях, можно выделить несколько ключевых аспектов, которые могут быть направлены на решение проблемы «плоской» точности обучения. Давайте подробно рассмотрим каждую из этих причин и возможные пути их устранения.

1. Нормализация данных

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

2. Проблема с количеством данных и параметров модели

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

  • Сокращение структуры модели: Уменьшите количество нейронов в полносвязных слоях или используйте меньшее количество сверток, чтобы уменьшить число параметров. Это может способствовать лучшему обобщению.
  • Аугментация данных: Убедитесь, что вы максимально используете аугментацию данных. Это поможет модели лучше обобщать и повышать её устойчивость к различным сценариям.

3. Регуляризация

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

4. Глубина модели

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

5. Использование правильной функции активации

Вы используете sigmoid для выхода, что возможно, но стоит проверить, как работает softmax для двух классов, если вы будете использовать его с binary_crossentropy. Также стоит протестировать различные активации в скрытых слоях, такие как LeakyReLU, которые могут помочь избежать проблемы «умирающих» нейронов с стандартным ReLU.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...