提高多类别图像分类器的准确性

时间:2020-05-26 05:33:39

标签: python computer-vision pytorch classification fast-ai

我正在使用Food-101数据集构建分类器。数据集具有预定义的训练和测试集,均已标记。它总共有101,000张图像。我正在尝试为top-1建立准确度> = 90%的分类器模型。我目前坐在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个时代。将其保存为第二阶段

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 个答案:

答案 0 :(得分:2)

  • 尝试使用诸如RandomHorizo​​ntalFlip,RandomResizedCrop, Torchvision转换中的RandomRotate,Normalize等。这些总是对分类问题有很大帮助。

  • 标签平滑和/或混合精度训练。

  • 只需尝试使用更优化的架构,例如EfficientNet。
  • 代替OneCycle,更长,更手动的培训方法可能会有所帮助。尝试权重衰减为5e-4且Nesterov动量为0.9的随机梯度下降。使用大约1-3个时期的热身训练,然后定期训练大约200个时期。您可以设置手动学习速率计划或余弦退火或其他方案。整个方法比通常的单周期训练要花费更多的时间和精力,并且只有在其他方法没有获得明显收益的情况下,才应进行探索。