【问题标题】:CNN not learning correctlyCNN 没有正确学习
【发布时间】:2020-07-17 21:10:39
【问题描述】:

我有一个包含 500 个植物图像的小型数据集,我必须为 [1, 10] 范围内的单个图像预测一个数字。数字之间存在顺序关系(10 > 9 > ... > 1)。这个问题类似于基于单张照片的年龄估计。

我尝试使用 Resnet18、Resnet34 和 VGG16 进行回归。他们都没有给出很好的结果。

有趣的一点是,当我为几张图像绘制热图时,它表明模型选择了错误的点来预测答案。这就像,如果我假设根据面部照片来预测年龄,那么 cnn 给背景的价值要高于实际的脸。

我也尝试了其他方法,例如分类和学习排名,但在我做热图时也会发生同样的事情。在这些方法中,我得到的最佳准确率是使用分类的 30% 和使用学习排名的 35%。

我使用 Fastai 实现和预训练的回归和分类方法。我使用的学习排名方法:https://github.com/Raschka-research-group/coral-cnn。我进行了一些更改,以便也能够使用预训练模型。

另一个重要的一点是数据集是不平衡的。 80% 的数据集对应于 6 到 10 类。

有没有人有任何改进它的提示或我可以尝试的其他方法?

编辑: 我的数据增强如下所示:

transforms.Compose([
                  transforms.Resize(256), transforms.CenterCrop(224),
                  transforms.RandomHorizontalFlip(p=0.5),
                  transforms.ColorJitter(brightness=0.15), 
                  transforms.ToTensor(),
                  transforms.Normalize([0.485, 0.456, 0.406], [0.299, 0.224, 0.225])
])

【问题讨论】:

    标签: deep-learning regression pytorch conv-neural-network multiclass-classification


    【解决方案1】:

    您可以尝试扩充数据集以获取更多数据(例如随机裁剪、旋转等),并确保对数据进行规范化。对于类不平衡问题,可以尝试使用 PyTorch 的WeightedRandomSampler

    #Let there be 9 samples in class 0 and 1 sample in class 1 respectively
    class_counts = [9.0, 1.0]
    num_samples = sum(class_counts)
    labels = [0, 0,..., 0, 1] #corresponding labels of samples
    
    class_weights = [num_samples/class_counts[i] for i in range(len(class_counts))]
    weights = [class_weights[labels[i]] for i in range(int(num_samples))]
    sampler = WeightedRandomSampler(torch.DoubleTensor(weights), int(num_samples))
    

    您应该能够轻松地将其应用到您的案例中,包含 10 个类,希望这能解决您的问题!

    【讨论】:

    • 感谢您的回答。我试过你的方法,但没有得到更好的结果。你能检查我的数据扩充是否正确吗?
    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多