记一次迁移学习训练ResNet50分类网络

使用迁移学习训练ResNet50

使用迁移学习训练ResNet50,刚开始只修改Linear层,使输出的类别数目和自己定制的数目一样,固定ResNet的backbone Train了30个epoch但是准确率之后可怜的72%,之后准确率就怎么也上不去了。后来设置backbone可以Train了,Train30个epoch准确率直接飙到92%。

代码已经上传到git上了。数据使用的Cifar10

下载完cifar-10后使用unpack-cifar10.py将cifar10的python对象转成png图像

使用main.py训练网络
设置resnet网络的尾部输出为10个神经元,resnet的其余参数设置为不可更改

resnet50 = models.resnet50(pretrained=True)
for param in resnet50.parameters():
    param.requires_grad = False
fc_inputs = resnet50.fc.in_features
resnet50.fc = nn.Sequential(
    nn.Linear(fc_inputs, 256),
    nn.ReLU(),
    nn.Dropout(0.4),
    nn.Linear(256, 10),
    nn.LogSoftmax(dim=1)
)

记一次迁移学习训练ResNet50分类网络_第1张图片
记一次迁移学习训练ResNet50分类网络_第2张图片
可以看出30个epoch后曲线走向收敛

这时候设置ResNet的backbone层可以修改,再Train30次

for param in resnet50.parameters():
    param.requires_grad = True

记一次迁移学习训练ResNet50分类网络_第3张图片
记一次迁移学习训练ResNet50分类网络_第4张图片
这里可以看到ACC和Loss都大幅度下降,迁移学习只训练尾部有时候不能达到理想精度,可以先训练尾部,再训练backbone,参考Fast R-cnn的多步训练法,有时候多步训练可以收敛到很好的效果

你可能感兴趣的:(人工智能)