无法在小数据集上训练多标签分类器

时间:2021-05-29 00:36:43

标签: python pytorch multilabel-classification fast-ai

我有一个包含 3 个类 container.RegisterSingleton<MapperProvider>(); animalslandscapes 的数据集。每个数据集只有 100 张图像,我正在尝试使用 ResNet34 + fastai 训练分类器,但我遇到了几个问题。

第一个是我认为我的模型没有正确训练。当我使用 lr_finder 时,我的验证损失是 buildings,除非这是预期的: enter image description here

然后我运行了 10 个 epoch。它看起来要么学习得很好,要么像地狱一样过度拟合。

enter image description here

然后我解冻找到另一个学习率,我的验证损失仍然是 naenter image description here

现在当我训练 10 个 epoch 时,图表开始振荡,这告诉我它不能再学习了。准确性看起来不错(除非它过度拟合)所以我决定使用我的验证集来看看我的模型实际上是如何做的: enter image description here

因为我有 300 张图片,240 张在 train 文件夹中,60 张在 test 文件夹中。我的测试图像被标记,因为我想对其进行准确度评分。这是我运行的单元格:

na

这是我遇到的错误:

    path = '/content/dataset/'

    data_test = ImageList.from_folder(path).split_by_folder(train='train', valid='test').label_from_re(file_parse).transform(size=512).databunch().normalize(imagenet_stats)

    learn = cnn_learner(data, models.resnet50, metrics=[accuracy, top_1],callback_fns=ShowGraph)

    learn.load('stage-2')

1 个答案:

答案 0 :(得分:0)

您的方法几乎没有问题:

  1. 您提到您使用 resnet 34 进行训练,然后保存其权重。然而,在测试时,您正在使用 resnet 50 并尝试加载 resnet 34 的权重,但由于不同的架构(层和参数)而无法正常工作。

  2. 如果您在同一个 NB 中进行测试,您可以在创建训练和有效数据集本身的同时添加测试数据集,并使用 2 行代码获得对整个数据集的预测。快速示例:

    test_imgs = (path/'cars_test/').ls()

    data.add_test(test_imgs)

    learn.data = 数据

    preds = learn.get_preds(ds_type=DatasetType.Test)

  3. 如果您打算在不同的 nb 中使用它,请尝试使用 model.export 来保存模型、其权重、数据和所有信息。我认为杰里米在他的 NB 和课程中做到了这一点。

相关问题