[pytorh学习]迁移学习transfer learning

迁移学习transfer learning

前言

基于pytorch官方教程迁移学习扩展
实际中,很少人会从零开始训练整个卷积神经网络(即随机初始化)。因为很少有机会能得到足够的数据集。
常见的是,我们会在一个很大的数据集(比如说Image Net)提前训练,然后使用卷积神经网络(ConvNet)要么作为一个初始值,要么作为一个固定的特征提取器。

两种主要的迁移学习情景:

  • Finetuning the convnet: 我们使用pretrained network来初始化参数网络,而不是随机初始化参数
  • ConvNet as fixed feature extractor:我们将除最后的全连接层之外的神经网络层参数保持不变。只有最后的全连接层被训练。
    (注:前面的层相当于特征提取层,进行特征工程。然而全连接层相当于把向量映射到目标向量的特征空间的作用)

迁移学习介绍
这篇文章介绍了以下几种方法

  • 第一种:就是刚才说的 ConvNet as fixed feature extractor
  • 第二种:对整个网络进行微调。假设你已训练好了识别猫品种的神经网络,你的网络能对50种猫按品种进行分类。接下来你想对网络进行升级,让其能够识别100种猫,这时你不应该只训练网络的最后一层,而应该逐层对网络中每个节点的权重进行微调。显然,只训练最后几层,是迁移学习最简单的1.0版,而对节点权重进行微调(fine turing),就是更难的2.0版,通过将其他层的权重固定,只训练一层这样的逐层训练,可以更好的完成上述任务。
  • 第三种: 另一种迁移学习的方式是借用网络的结构,即不是使用已训练好的网络的权重,而是使用相同的网络结构,例如多少层,每层多少节点这样的信息,然后使用随机生成的权重作为训练的起点。
    迁移学习方法
    这幅图说明了该用哪种迁移学习,让我们逐个来看。

1)右下角场景,待训练的数据集较小,已训练的模型和当前任务相似。此时可以只是重新训练已有模型的靠近输出的几层,例如将ImageNet中输出层原来可以判别一万种输出的网络改的只能判别猫的品种,从而利用已有网络来做低层次的特征提取。

2)左下角场景,待训练的数据集较小,已训练的模型和当前任务场景差距较大。例如你有的已训练网络能识别出白天高速路上的违章车辆,你需要训练一个能识别出夜间违章车辆的模型,由于不管白天夜晚,交通规则是没有变化的,所以你需要将网络靠近输入的那几层重新训练,等到新的网络能够提取出夜间车辆的基本信息后,就可以借用已有的,在大数据集下训练好的神经网络来识别违章车辆,而不用等夜间违章的车辆的照片积累的足够多之后再重新训练。

3)左上角场景,待训练的数据集较大,已有的模型和新模型的数据差异度很高。此时应该做的是从头开始,重新训练。

4)右上角场景,待训练的数据集较大,已有模型的训练数据和现有的训练数据类似。此时应该使用原网络的结构,并保留每一层的节点权重,再逐层微调。

官网教程部分

有时间再更改

猜你喜欢

转载自blog.csdn.net/crabstew/article/details/89083956