欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-04 22:59:31
...

使用迁移学习训练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分类网络
记一次迁移学习训练ResNet50分类网络
可以看出30个epoch后曲线走向收敛

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

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

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

相关标签: 人工智能