提高多 class 图像的准确性 classifiier
Improving accuracy on a multi-class image classifiier
我正在使用 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
在这里,我试图找到学习率。与讲座中的表现相当标准:
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
使用 1e-06 的学习率 运行 另外 5 个 epoch。将其保存为阶段 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
之前我总共 运行 3 个阶段,但模型没有改进超过 0.706403,所以我不想重复。下面是我的混淆矩阵。我为糟糕的决议道歉。是 Colab 做的。
由于我创建了一个额外的验证集,我决定使用测试集来验证已保存的 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)]
尝试使用 RandomHorizontalFlip、RandomResizedCrop、
来自 torchvision 变换的 RandomRotate、Normalize 等。这些在分类问题上总是很有帮助。
标签平滑and/or混合精度训练。
- 只需尝试使用更优化的架构,例如 EfficientNet。
- 代替 OneCycle,更长时间、更手动的训练方法可能会有所帮助。尝试权重衰减为 5e-4 且 Nesterov 动量为 0.9 的随机梯度下降。使用大约 1-3 个 epoch 的热身训练,然后进行大约 200 个 epoch 的常规训练。您可以设置手动学习率计划或余弦退火或其他一些方案。整个方法将比通常的单周期训练消耗更多的时间和精力,只有在其他方法没有显示出可观的收益时才应探索。
我正在使用 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
在这里,我试图找到学习率。与讲座中的表现相当标准:
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
使用 1e-06 的学习率 运行 另外 5 个 epoch。将其保存为阶段 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
之前我总共 运行 3 个阶段,但模型没有改进超过 0.706403,所以我不想重复。下面是我的混淆矩阵。我为糟糕的决议道歉。是 Colab 做的。
由于我创建了一个额外的验证集,我决定使用测试集来验证已保存的 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)]
尝试使用 RandomHorizontalFlip、RandomResizedCrop、 来自 torchvision 变换的 RandomRotate、Normalize 等。这些在分类问题上总是很有帮助。
标签平滑and/or混合精度训练。
- 只需尝试使用更优化的架构,例如 EfficientNet。
- 代替 OneCycle,更长时间、更手动的训练方法可能会有所帮助。尝试权重衰减为 5e-4 且 Nesterov 动量为 0.9 的随机梯度下降。使用大约 1-3 个 epoch 的热身训练,然后进行大约 200 个 epoch 的常规训练。您可以设置手动学习率计划或余弦退火或其他一些方案。整个方法将比通常的单周期训练消耗更多的时间和精力,只有在其他方法没有显示出可观的收益时才应探索。