После преодоления переобучения, как увеличить точность обучения?

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

Я строю CNN с использованием Keras для задачи классификации. Я начал с простой модели в качестве отправной точки, и как это обычно бывает со всеми задачами машинного обучения, особенно если набор данных не очень большой, я столкнулся с почти немедленным серьезным переобучением, как видно на графике enter image description here

Чтобы попытаться преодолеть это переобучение, я начал с уменьшения размера сети до половины (половина количества единиц в слое) и добавления L2-регуляризаторов весов, что немного улучшило переобучение, как вы можете видеть здесь enter image description here

Затем я добавил слои дропаутов, которые также помогли, особенно с шумом на валидационной кривой enter image description here

После этого, чтобы увеличить объем обучающих данных, я использовал аугментацию данных с помощью класса ImageDataGenerator из Keras, который работает как ожидалось (уменьшая метрики обучения, одновременно улучшая метрики валидации) и, похоже, сильно помогает с переобучением enter image description here

Поскольку валидационные кривые начинают следовать за обучающими, теперь кажется, что задача состоит в том, как улучшить обучающие метрики, и вот тут возникает мой вопрос: обучающие метрики почти стабильны после 10 эпох, и они не улучшаются, независимо от того, сколько эпох добавляется, и единственное, что я мог бы попробовать, это уменьшить скорость обучения, когда точность обучения перестает улучшаться. Поэтому я добавил обратный вызов ReduceLROnPlateau, который уменьшает скорость обучения до 20% от предыдущей, если точность обучения не увеличивается в течение 3 эпох, но это не решает проблему, точность обучения все еще застряла на уровне 90-92% enter image description here

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

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

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

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

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

Учитывая ваши усилия по преодолению переобучения и текущие проблемы с точностью обучения, можно рассмотреть несколько стратегий для увеличения точности обучения вашей сверточной нейронной сети (CNN), созданной с использованием Keras.

1. Оптимизация архитектуры модели

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

  • Fully Connected Layers: Если ваша архитектура не включает полносвязные слои, добавление нескольких таких слоев может помочь модели лучше обрабатывать признаки, извлеченные сверточными слоями. Убедитесь, что размер этих слоев сбалансирован с размерами сверток.
  • Batch Normalization: Включение слоев нормализации пакетов может помочь ускорить обучение и повысить стабильность модели. Их можно применять после сверток и перед активациями, а также на полносвязных слоях.

2. Улучшения в процессе обучения

  • Адаптивные методы обучения: Попробуйте использовать более продвинутые оптимизаторы, такие как Adam или RMSprop, которые могут адаптивно регулировать скорость обучения, обеспечивая более плавное и качественное обучение.
  • Early Stopping: Убедитесь, что вы используете механизм ранней остановки, чтобы избежать ненужных эпох, когда точность перестает расти. Это поможет сохранить лучшие параметры модели.

3. Эффективное использование данных

  • Дополнительная аугментация данных: Вы уже применили аугментацию данных, однако стоит рассмотреть возможность экспериментов с различными методами аугментации, такими как случайные повороты, сдвиги, изменения яркости и контрастности.
  • Кросс-валидация: Попробуйте использовать k-fold кросс-валидацию, чтобы убедиться, что ваша модель стабильна и не зависит от конкретной разбивки на обучающие и тестовые данные. Это также поможет в выявлении потенциального недобора информации.

4. Параметры обучения

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

5. Снижение переобучения

  • Spatial Dropout: Если вы еще не применяли пространственный дроп-аут, это может значительно помочь в задачах обработки изображений, особенно на сверточных слоях.
  • Шум: Попробуйте добавить искусственный шум к данным, что может помочь модели стать более устойчивой к шумам в данных, улучшив её обобщающую способность.

6. Увеличение объема данных

  • Настоящие данные: Если возможно, старайтесь получить дополнительные реальные данные. Вы можете рассмотреть возможность краудсорсинга или использования общественных наборов данных, схожих по теме с вашей задачей. Чем больше и разнообразнее ваши данные, тем лучше будет ваша модель.

Заключение

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

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

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