Повышение точности мультиклассового классификатора изображений - PullRequest
1 голос
/ 26 мая 2020

Я создаю классификатор, используя набор данных Food-101. В наборе данных есть предопределенные наборы для обучения и тестирования, оба помечены. Всего 101 000 изображений. Я пытаюсь построить модель классификатора с точностью> = 90% для топ-1. Я сейчас сижу на 75%. Тренировочный набор был предоставлен нечистым. Но теперь я хотел бы узнать, как я могу улучшить свою модель, и какие вещи я делаю неправильно.

Я разделил поезд и тестовые изображения по соответствующим папкам. Здесь я использую 0,2 из набора обучающих данных для проверки учащегося, запустив 5 эпох.

np.random.seed(42)
data = ImageList.from_folder(path).split_by_rand_pct(valid_pct=0.2).label_from_re(pat=file_parse).transform(size=224).databunch()

top_1 = partial(top_k_accuracy, k=1)
learn = cnn_learner(data, models.resnet50, metrics=[accuracy, top_1], callback_fns=ShowGraph)
learn.fit_one_cycle(5)
epoch   train_loss  valid_loss  accuracy    top_k_accuracy  time
0       2.153797    1.710803    0.563498    0.563498    19:26
1       1.677590    1.388702    0.637096    0.637096    18:29
2       1.385577    1.227448    0.678746    0.678746    18:36
3       1.154080    1.141590    0.700924    0.700924    18:34
4       1.003366    1.124750    0.707063    0.707063    18:25

enter image description here

И здесь я Пытаюсь найти скорость обучения. Довольно стандартно для того, как это было на лекциях:

learn.lr_find()
learn.recorder.plot(suggestion=True)
LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.
Min numerical gradient: 1.32E-06
Min loss divided by 10: 6.31E-08

enter image description here

Использование скорости обучения 1e-06 для прохождения еще 5 эпох . Сохранение его как stage-2

learn.fit_one_cycle(5, max_lr=slice(1.e-06))
learn.save('stage-2')
epoch   train_loss  valid_loss  accuracy    top_k_accuracy  time
0       0.940980    1.124032    0.705809    0.705809    18:18
1       0.989123    1.122873    0.706337    0.706337    18:24
2       0.963596    1.121615    0.706733    0.706733    18:38
3       0.975916    1.121084    0.707195    0.707195    18:27
4       0.978523    1.123260    0.706403    0.706403    17:04

enter image description here

Раньше я выполнял всего 3 этапа, но модель не улучшалась выше 0,706403, поэтому я не хотел повторять. Ниже представлена ​​моя матрица путаницы. Прошу прощения за ужасное разрешение. Это работа Colab.

enter image description here

Поскольку я создал дополнительный набор для проверки, я решил использовать набор для проверки сохраненной модели stage-2, чтобы увидеть, насколько хорошо он работает:

path = '/content/food-101/images'
data_test = ImageList.from_folder(path).split_by_folder(train='train', valid='test').label_from_re(file_parse).transform(size=224).databunch()

learn.load('stage-2')
learn.validate(data_test.valid_dl)

Это результат:

[0.87199837, tensor(0.7584), tensor(0.7584)]

1 Ответ

2 голосов
/ 27 мая 2020
  • Попробуйте дополнения, такие как RandomHorizontalFlip, RandomResizedCrop, RandomRotate, Normalize и c из преобразований torchvision. Они всегда очень помогают в проблемах классификации.

  • Сглаживание меток и / или обучение точности смешивания.

  • Просто попробуйте использовать более оптимизированную архитектуру, например Efficien tNet.
  • Вместо OneCycle может помочь более длительный ручной подход. Попробуйте Stochasti c Gradient Descent со спадом веса 5e-4 и моментумом Нестерова 0,9. Используйте разминку примерно на 1-3 эпохи, а затем регулярную тренировку примерно на 200 эпох. Вы можете установить расписание скорости обучения вручную, косинусный отжиг или другую схему. Весь этот метод потребует намного больше времени и усилий, чем обычная тренировка с одним циклом, и его следует использовать только в том случае, если другие методы не дают значительного улучшения.
...