迁移学习
为什么要迁移学习
实验证明,若不进行迁移学习, 从零开始训练模型花费较大, 并且往往拟合也较差,可能因为数据集太小
预训练的模型已经经过非常大数据量的训练,泛化能力十分强大,成熟度高,可以直接拿来使用降低各种训练成本,还可以得到泛化很好的模型
怎样迁移学习
一般方法: 对已经预训练的模型, 将其输出层砍掉,加入新的输出层, 并且随机初始化新输出层的权重(浅层权重不随机)
如果要识别数据集是baseline数据集的子集,可以将输出层子集的向量单独拿出,其他的向量砍掉(子集有多类)或 随机初始化(子集只有一类 是二分类问题)
并且超参数也要调
迁移学习研究领域
1. 按特征空间分类
- 同构迁移学习
- 异构迁移学习
2. 按监督信息分类
- 有监督迁移学习
- 半监督迁移学习
- 无监督迁移学习
3. 按学习方法分类
- 基于实例的迁移学习方法
- 基于特征的迁移学习方法
- 基于模型的迁移学习方法
- 基于关系的迁移学习方法
代码实例
model_conv = torchvision.models.resnet18(pretrained=True)
# 固定卷积层的权重参数
for param in model_conv.parameters():
param.requires_grad = False
# 新的网络层的参数默认 requires_grad=True
num_ftrs = model_conv.fc.in_features
model_conv.fc = nn.Linear(num_ftrs, 2)
model_conv = model_conv.to(device)
criterion = nn.CrossEntropyLoss()
# 只对输出层的参数进行更新
optimizer_conv = optim.SGD(model_conv.fc.parameters(), lr=0.001, momentum=0.9)
# 学习率策略,每 7 个 epochs 乘以 0.1
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_conv, step_size=7, gamma=0.1)