Alex_McAvoy

想要成为渔夫的猎手

迁移学习

【概述】

迁移学习(Transfer Learning)是利用数据、任务或模型之间的相似性,将在旧领域训练好的模型,应用于新的领域这样的过程,要求两个任务的输入属于同一性质,即要么同是图像、要么同是语音或其他

当有海量的数据资源时,能够很容易从海量数据中学习到一个鲁棒性很强的模型,可以不需要迁移学习

但通常情况下,需要研究的领域可获得的数据极为有限,在少量的训练样本上精度极高,但是泛化效果极差,此时就需要迁移学习

此外,由于训练成本的问题,很少会去从头开始训练一整个深度卷积网络,从头开始训练一个卷积网络通常需要较长时间且依赖于强大的 GPU 计算资源

【方法】

最常见的迁移学习方法是微调(Fine Tuning)

对于已训练好的模型,称之为预训练模型(Pre-trained Model),通常需要加载以预训练模型,然后根据实际训练数据调整网络模型参数

在 PyTorch 的 vision 中,给出了 AlexNet、GoogLeNet、ResNet 等经典卷积神经网络的预训练模型

在从 torchvision.models 中导入后,即可使用,例如:

1
2
3
4
5
6
7
from torchvision.models import resnet50, ResNet50_Weights

# 使用预训练权重
resnet50(weights=ResNet50_Weights.IMAGENET1K_V1)

# 不使用预训练权重
resnet50(weights=None)

关于具体使用方法,详见:PyTorch 文档

假设有两个任务 $A$ 与 $B$,任务 $A$ 不是目标任务,其拥有海量的数据资源并且有已训练好 $1000$ 个类别的模型,任务 $B$ 是目标任务,是 $300$ 个类别分类

具体做法是:

  1. 加载任务 $A$ 的模型,作为预训练模型
  2. 在预训练模型的基础上,根据任务 $B$ 的要求,修改最后的输出结构
  3. 进行重训练
    1. 如果任务 $B$ 的数据量小,那么就将任务 $A$ 的预训练模型的所有层进行冻结(Freeze),即不进行训练,剩下的输出层调整参数
    2. 如果任务 $B$ 的数据量大,那么就将任务 $A$ 的预训练模型中大部分层进行冻结(Freeze),剩下的层在新任务数据基础上调整参数
感谢您对我的支持,让我继续努力分享有用的技术与知识点!