Я работаю над классификатором с использованием набора данных Food-101. Я пытаюсь получить оценку SOTA> = 90%, используя ResNet50. Изначально сидел на 75% точности. Когда я включил сглаживание меток, я подскочил до сладкого 81%, но теперь, когда я использую get_transforms fastai, я упал до 79%. Я также заметил, что, хотя я использую увеличение изображения, размер моих данных не увеличивался, когда я управлял эпохой.
В настоящее время переменная tfms - это мое увеличение:
np.random.seed(42)
path = '/content/food-101/images/train'
file_parse = r'/([^/]+)_\d+\.(png|jpg|jpeg)$'
tfms = get_transforms(do_flip=True,flip_vert=True, max_rotate=10.0, max_zoom=1.1, max_lighting=0.2, max_warp=0.2, p_affine=0.75, p_lighting=0.75)
data = ImageList.from_folder(path).split_by_rand_pct(valid_pct=0.2).label_from_re(pat=file_parse).transform(tfms, size=224).databunch()
top_1 = partial(top_k_accuracy, k=1)
learn = cnn_learner(data, models.resnet50, metrics=[accuracy, top_1], loss_func = LabelSmoothingCrossEntropy(), callback_fns=ShowGraph)
learn.lr_find()
learn.recorder.plot(suggestion=True)
My learning rate also slightly increased from 1.02e-06 to 1.023e-06 when I applied get_transforms() to my model.
I’m running another 5 epochs. The accuracy is low due to label smoothing. This isn’t an issue:
learn.fit_one_cycle(5, max_lr=slice(1.023e-06/5, 1.023e-06/15))
learn.save('stage-2')
epoch train_loss valid_loss accuracy top_k_accuracy time
0 6.549849 5.393574 0.009835 0.009835 18:39
1 6.520850 5.373156 0.009835 0.009835 17:57
2 6.468420 5.362789 0.009901 0.009901 17:49
3 6.461528 5.363743 0.009769 0.009769 17:51
4 6.473554 5.364657 0.009901 0.009901 18:05
Now I’m pulling out another learning rate. It jumped to 1.03e-06.
learn.unfreeze()
learn.lr_find()
learn.recorder.plot(suggestion=True)
Running another 5 epochs using the new LR and saving it. In this round, the label smoothing does not seem to have the same effect as it did on the earlier run. The model is now showing better accuracy than the earlier 5 epochs:
learn.fit_one_cycle(5, max_lr=slice(1e-03/5, 1e-03/15))
learn.save('stage-3')
epoch train_loss valid_loss accuracy top_k_accuracy time
0 3.476312 2.645357 0.491683 0.491683 18:11
1 2.781384 2.276255 0.599670 0.599670 18:22
2 2.356208 1.974409 0.677426 0.677426 18:31
3 2.068619 1.836324 0.732409 0.732409 18:26
4 1.943876 1.789893 0.742310 0.742310 18:20
введите описание изображения здесь
Когда я проверял путаницу, используя этот блок кода:
interp.plot_confusion_matrix()
interp.most_confused(min_val=5)
interp.plot_multi_top_losses()
interp.plot_confusion_matrix(figsize=(20, 20), dpi=200)
, я получил этот вывод о моем наборе проверки:
15081 misclassified samples over 15150 samples in the validation set.
Наконец, когда я проверяю модель с помощью тестового набора, я получаю следующее:
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-3')
learn.validate(data_test.valid_dl)
[1.602944, тензор (0,7987), тензор (0,7987)]