记一次迁移学习训练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)
)
可以看出30个epoch后曲线走向收敛
这时候设置ResNet的backbone层可以修改,再Train30次
for param in resnet50.parameters():
param.requires_grad = True
这里可以看到ACC和Loss都大幅度下降,迁移学习只训练尾部有时候不能达到理想精度,可以先训练尾部,再训练backbone,参考Fast R-cnn的多步训练法,有时候多步训练可以收敛到很好的效果
上一篇: Pytorch:Batch Normalization批标准化
下一篇: Softmax函数与交叉熵