1.数据增强
图像增强算是训练cv模型的标配操作了,尤其是随机裁剪(randomCrop)和水平翻转两种增强方法,几乎是一定会带来效果提升的。其它的数据增强方法还有很多,并不都一定有效,需要结合实际情况,更多的还是通过对比实验,交叉验证来尝试。
2.模型微调
现实世界中,假定要使我们的模型识别一种新物体(以椅子为例)的模型时,我们需各种椅子各个角度的图片,然后训练,但我们会遇到以下问题:
- 如果原始数据集的规模像ImageNet那么大,则可能会过拟合。
- 解决问题1,需要搜集更多的数据,花费更多时间和金钱成本。
因此,本节主要介绍迁移学习(transfer learning)的一种常用技术:微调(fine tuning),用来解决上述问题。
a. 我们直接使用原始模型的参数,对新的数据集进行训练,需要修改的是输入数据集和输出层。
b. 虽然原始数据集中其余的图像和椅子无关,但是从原始模型中也能学习到识别边缘、纹理、形状和物体组成等特性,这些特征对识别椅子一样有效。
c. 使用这种方法能快速得到精度较好的模型。
使用resnet预训练模型核心代码如下:
# 加载预训练模型
pretrained_net = models.resnet18(pretrained=False)
pretrained_net.load_state_dict(torch.load('/home/kesci/input/resnet185352/resnet18-5c106cde.pth'))
# 修改输出层
pretrained_net.fc = nn.Linear(512, 2)
# 初始化参数
# 输出参数
output_params = list(map(id, pretrained_net.fc.parameters()))
# 特征参数(中间层参数,继承预训练模型参数)
feature_params = filter(lambda p: id(p) not in output_params, pretrained_net.parameters())
# 需要注意到的是,特征参数由于是微调,学习率设置的小于输出参数
lr = 0.01
optimizer = optim.SGD([{'params': feature_params},
{'params': pretrained_net.fc.parameters(), 'lr': lr * 10}],
lr=lr, weight_decay=0.001)