Вопрос или проблема
Модель EfficientNet была обучена на ~3500 изображениях для классификации на 4 класса: A, B, C и Neither – с точностью 0.985 – кем-то другим, не мной. Я довольно нов в ML. Итак, у нас есть эта модель, и она работает довольно хорошо.
Поскольку от пользователей поступает все больше реальных изображений, мы видим больше ошибок. Возможно ли немного улучшить производительность, добавив больше обучающих примеров?
Собрали и вручную отсортировали 35 изображений класса A и 425 изображений класса “Neither”. Имеет ли это смысл при таком небольшом наборе данных?
Я поместил изображения в папку с 4 подпапками, по одной для каждого класса. Две пустые, две содержат изображения. Используя Keras ImageDataGenerator flow_from_directory()
с соотношением валидация/обучение = 0.2/0.8.
model.fit()
показывает низкие потери и точность, близкую к 1, в то время как потери при валидации высоки, а точность составляет всего около 0.21 — 0.25.
Производительность модели после моего “обучения” полностью испорчена.
Правильный ли этот подход к дообучению с малым набором изображений?
Как я могу “добавить”, а не “заменить” “умения” модели новым добавленным небольшим набором изображений?
Может быть, мне следовало обучить новую модель, инициализированную весами ImageNet, как в первоначальном обучении, и просто добавить новые изображения в набор изображений, используемый, опять же, в первоначальном обучении?
Проблема, которую вы описываете, называется трансферное обучение, которое использует предварительно обученную модель (например, EfficientNet), обученную на существующем наборе данных, и применяет ее к другому набору данных. Поскольку этот метод использует предварительно обученную модель, новому набору данных, для которого необходимо выполнить трансферное обучение, не нужно столько же обучающих примеров, как если бы модель обучалась с нуля.
В вашем конкретном случае вы можете рассмотреть возможность использования существующей модели EfficientNet, предварительно обученной на другом наборе данных (например, ImageNet), и добавить один или два слоя, чтобы адаптировать модель под ваш набор данных (т.е. количество выходных нейронов должно соответствовать количеству классов, которые вы хотите классифицировать). Затем вы можете обучить предварительно обученную модель на вашем конкретном наборе данных, однако убедитесь, что в начале вы зафиксировали параметры предварительно обученной модели, чтобы модель сохранила свои знания.
Ответ или решение
Для того чтобы улучшить производительность модели EfficientNet, обученной на 4 классах (A, B, C и Ни один), при условии, что у вас есть лишь ограниченное количество новых данных для классов A и "Ни один", необходимо учесть несколько аспектов и следовать определенной стратегии.
Понимание проблемы
Ваш первоначальный опыт с перенастройкой модели говорит о том, что вы столкнулись с переобучением. Это происходит, когда модель начинает запоминать данные из обучающего набора, вместо того чтобы обобщать свои знания, особенно когда подача данных ограничена и сильно несбалансирована.
Цели перенастройки
-
Сохранение знаний: Вы хотите не просто «заменить» навыки модели, а «добавить» к ним знания о новых классах.
-
Использование жёсткой (замороженной) модели: Для начала, стоит заморозить большинство слоёв модели EfficientNet, чтобы не потерять информацию, уже содержащуюся в ней.
Рекомендованный подход
-
Загрузка предобученной модели: Начните с предобученной версии EfficientNet, обученной на ImageNet. Это даст начальные веса, обогащенные большим количеством изображений.
-
Добавление новых слоёв: Добавьте выходной слой (или несколько слоёв) для вашей конфигурации классов. Например, используйте полносвязный слой с числом нейронов, равным количеству ваших классов (в данном случае – 4).
-
Заморозка слоёв: Заморозьте первые несколько слоёв (например, 80% модели), чтобы не изменять их веса. Обычно полезно замораживать все слои, кроме последних двух или трёх, которые специализируются на пользователей данных.
-
Данные для обучения: Используйте
ImageDataGenerator
для генерации изображений, но учтите, что вам нужно обеспечить сбалансированность классов. При этом учитывайте соотношение классов при создании батчей. -
Ограниченное обучение: Обучайте только те слои, которые не были заморожены, на всём доступном наборе данных. Настройте количество эпох обучения так, чтобы избежать переобучения. Это можно сделать, контролируя мониторинг валидационной потери и точности.
-
Аугментация изображений: Особенно для классов с малым количеством изображений, таких как класс A (35 изображений), стоит использовать аугментацию. Это поможет увеличить количество структур данных.
Использование дополнительных данных
Если возможно, рассмотрите возможность увеличения объёмов данных для обучения. Это может включать в себя:
-
Сбор дополнительных изображений: Активная работа по сбору новых изображений для классов A и "Ни один".
-
Использование синтетических данных: Используйте методы генерации изображений, такие как GAN (Generative Adversarial Networks) для создания дополнительных примеров данных.
Заключение
Ретрaining EfficientNet с ненадлежащим количеством данных может привести к значительным проблемам, таким как переобучение. Следуя описанным шагам и требованиям подготовки данных, вы сможете улучшить свою модель, сохранив ранее полученные знания. Также не забывайте التقادير المدمجة для измерения улучшений, анализируя качество модели до и после перенастройки. Исполнение данной стратегии позволит вам результативно использовать вашу модель для улучшения классификации в ваших сценариях.
Помните, что успех в машинном обучении во многом зависит не только от архитектуры модели, но и от качества и количества данных, с которыми вы работаете.