我刚刚开始了一个图像分类项目,按照PyTorch网站文档中的教程进行(这个)。在教程中,有一段代码如下:
model_ft = models.resnet50(pretrained=True)num_ftrs = model_ft.fc.in_featuresmodel_ft.fc = nn.Linear(num_ftrs, 20)
我已经知道了为什么需要更改全连接层(fc层)。由于我的项目需要对20个类别进行分类,所以我只是将参数从2改成了20。但是,我得到的准确率只有大约60%。当我不更改fc层,像这样:
model_ft = se_resnet50(pretrained = True)
结果准确率达到了93.75%,与之前的结果相比好得多。
我实在搞不明白为什么在修改fc层后分类结果会变差。难道不应该修改吗?
回答:
网络在20个类别中找到匹配类别可能比在两个类别中更难。
例如,如果你给它一张狗的图片,需要在猫、狗和马之间进行分类,它可能会给出60%猫、30%狗、10%马的概率,然后就错了;而如果只需要在狗和马之间分类,它可能会给出75%狗、25%马的概率,然后就对了。
微调的时间也会更长,所以如果你没有在达到收敛后停止训练,而是在固定数量的epoch后停止,那么对于20个类别进行更长时间的训练可能会得到更好的结果。