Плохая работа CNN для базовой задачи классификации изображений

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

Как дела?

Я экспериментирую с CNN в FastAI.

Моя модель с 2 миллионами параметров дает всего около 80% точности. Я также пробовал нормализацию данных, нормализацию пакетов, сглаживание меток, Mixup, но результаты все равно остаются на уровне 80-81% (они быстрее сходились с этими техниками).

Я предположил, что большая модель даст лучшие прогнозы, поэтому увеличил количество параметров (с 2 миллионов до 182 миллионов). Однако результат все равно составляет 82% после 40 эпох.

imagenette = DataBlock(blocks = (ImageBlock, CategoryBlock),
                   get_items = get_image_files,
                   get_y = parent_label,
                   splitter = GrandparentSplitter(train_name="train", valid_name="val"),
                   item_tfms = Resize(460),
                   batch_tfms = aug_transforms(size=244)
                  )
dls = imagenette.dataloaders(path)



def conv_manual(ni, nf, ks=3, act=True):
conv = nn.Conv2d(ni, nf, stride=2, kernel_size=ks, padding = ks//2)
if act: conv = nn.Sequential(
    conv, 
    nn.ReLU(),
    #nn.AvgPool2d(2,stride=2, padding=1),
    BatchNorm(nf)
)
return conv

test_cnn = sequential(
    conv_manual(3,8, ks=5),            #122x122
    conv_manual(8,64),                 #61x61
    conv_manual(64,100),                #31x31
    conv_manual(100,250),                #16x16
    conv_manual(250,800),               #8x8
    conv_manual(800,3000),              #4x4
    conv_manual(3000, 6000),             #2x2
    conv_manual(6000,10, act=False),   #1x1  
    Flatten(),
)

test_model.fit_one_cycle(10, 0.00015)

Результат после 40 эпох

Надеюсь, вы сможете дать мне несколько советов по этому поводу.

Спасибо.

  1. Вы можете попробовать другие архитектуры, такие как ResNets, U-Nets, Inception Networks.
  2. Вам также нужно выполнить дополнительную настройку гиперпараметров посмотрите некоторые инструменты для настройки ваших моделей.

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

Ваша ситуация с низкой производительностью модели сверточной нейронной сети (CNN) для задачи классификации изображений действительно может быть вызвана множеством факторов. Позвольте мне предложить несколько рекомендаций для улучшения результатов.

1. Архитектура модели

Хотя вы уже создали свою собственную модель CNN, стоит рассмотреть возможность использования предобученных архитектур, таких как ResNet, EfficientNet или VGG. Эти модели были разработаны с учетом многих аспектов классификации изображений и обладают хорошо настроенными весами, что может значительно улучшить производительность.

Вы можете использовать такие подходы, как transfer learning, где вы берете предобученную модель и дообучаете её на вашем наборе данных.

2. Гиперпараметры и регуляризация

Смещение в гиперпараметрах может привести к плохой производительности. Попробуйте следующие методы:

  • Лearning Rate Scheduling: Изменение скорости обучения в процессе обучения может помочь модели лучше собирать отклонения. Вы можете использовать циклический алгоритм изменения скорости обучения.

  • Изменение размера батча: Попробуйте варьировать размер батча, например, уменьшить его до 32 или 64.

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

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

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

Убедитесь, что ваши данные правильно нормализованы. Бывает полезно привести пиксели изображения к диапазону [0,1] или к нормальному распределению.

4. Увеличение данных

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

5. Тестирование различных функций активации

Хотя ReLU является стандартом, попробуйте использовать другие функции активации, такие как Leaky ReLU, SELU или SiLU, которые могут помочь с проблемой исчезающих градиентов.

6. Проверка качества данных

Убедитесь, что ваши данные сбалансированы и правильные метки. Разница в качестве меток может существенно снизить точность модели. Проверьте, нет ли классов, представленных слишком малым количеством изображений.

7. Оценка сложностей

Если ваш набор данных небольшого размера (например, изображение только 10 классов), возможно, стоит проверить метрики, такие как F1-score, precision, recall, чтобы получить более полное представление о производительности модели.

Заключение

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

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

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

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