文章目录

前言

在实际生产生活中所接触到的数据集,远不及ImageNet数据集中样本数的十分之一,这可能导致模型过拟合。同时,因为数据量有限,最终训练得到的模型的精度也达不到实用的要求。
为了应对上述问题,最切实可行的方式是应用迁移学习(transfer learning), j将从原数据集学到的知识迁移到目标数据集上。虽然ImageNet数据集的图像大多跟目标类无关,但在该数据集上训练的模型可以抽取较通用的图像特征,从而能够帮助识别边缘、纹理、形状和物体组成等。这些类似的特征对于识别目标类也可能同样有效。

微调

本博文将介绍迁移学习中的一种常用技术:微调(fine tuning)。如下图所示,微调由以下四步构成:

  • 在源数据集(如ImageNet数据集)上预训练一个神经网络模型,即源模型。
  • 创建一个新的神经网络模型,即目标模型。它复制了源模型上除了输出层外的所有模型设计及其参数。我们假设这些模型参数包含了源数据集上学习到的知识,且这些知识同样适用于目标数据集。我们还假设源模型的输出层与源数据集的标签紧密相关,因此在目标模型中不予采用。
  • 为目标模型添加一个输出大小为目标数据集类别个数的输出层,并随机初始化该层的模型参数。
  • 在目标数据集上训练目标模型。我们将从头训练输出层,而其余层的参数都是基于源模型的参数微调得到的。
    微调(pytorch)_神经网络模型
    当目标数据集远小于源数据集时,微调有助于提升模型的泛化能力。

代码实现

pretrained_net = models.resnet18(pretrained=True)
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)

Reference

​fine-tuning​