1. Transfer Learning & Model Finetune
-
Transfer Learning:机器学习分支,研究源域(source domain)的知识如何应用到目标域(target domain)
-
Model Finetune:模型的迁移学习
我们一般可以将一个卷积神经网络分为两部分,一般将前面的一些列卷积池化操作定义为features extractor,通过这些卷积池化操作得到feature map,我们就认为这些feature maps就是他的特征,这些feature maps 最后会与一些列的全连接层(FC层),而这些全连接层可以看做classifier部分,因此将一个卷积神经网络分为特征提取部分和分类器部分。
我们认为特征提取的部分是具有共性的部分,可以原封不动的进行迁移,而分类器的参数与具体的分类任务有关,通常我们需要进行改变,特别注意的地方是,我们一般都要改变最后一个输出层
2. Pytorch中的Finetune
-
模型微调步骤:
- 获取与训练模型参数(原任务中学习到的知识)
- 加载模型(load_state_dict)
- 修改输出层
-
模型微调训练方法:
- 固定预训练的参数(requires_grad = False; lr=0)
for param in resnet18_ft.parameters():
param.requires_grad = False
- Features Extractor设置较小的学习率,而classifer的学习率可以比较大(可以通过params_group方法对不同部分设置不同的学习率)
fc_params_id = list(map(id, resnet18_ft.fc.parameters())) # 返回的是parameters的 内存地址
"""将网络层中的参数分为fc层参数和features extractor部分参数,通过filter函数实现"""
base_params = filter(lambda p: id(p) not in fc_params_id, resnet18_ft.parameters())
optimizer = optim.SGD([
{'params': base_params, 'lr': LR*0.1}, # 如果将LR设置为0,则不改变模型参数
{'params': resnet18_ft.fc.parameters(), 'lr': LR}], momentum=0.9)