深度学习(十三):迁移学习Transfer Learning

版权声明:尊重知识产权与劳动成果 https://blog.csdn.net/hzk1562110692/article/details/88728582

这是一系列深度学习的介绍,本文不会涉及公式推导,主要是一些算法思想的随笔记录。
适用人群:深度学习初学者,转AI的开发人员。
编程语言:Python
参考资料:吴恩达老师的深度学习系列视频
吴恩达老师深度学习笔记整理
深度学习500问
唐宇迪深度学习入门视频课程
笔记下载:深度学习个人笔记完整版

迁移学习的背景

在传统分类学习中,为了保证训练得到的分类模型具有准确性和高可靠性,都有两个基本的假设:
(1) 用于学习的训练样本与新的测试样本满足独立同分布
(2) 必须有足够可用的训练样本才能学习得到一个好的分类模型
但是,在实际应用中我们发现这两个条件往往无法满足。首先,随着时间的推移,原先可利用的有标签样本数据可能变得不可用,与新来的测试样本的分布产生语义、分布上的缺口。另外,有标签样本数据往往很缺乏,而且很难获得。这就引起了机器学习中另外一个重要问题,如何利用少量的有标签训练样本或者源领域数据,建立一个可靠的模型对具有不同数据分布的目标领域进行预测。

站在巨人的肩膀上

举图像识别中最常见的例子,训练一个神经网络。来识别不同的品种的猫,你若是从头开始训练,你需要百万级的带标注数据,海量的显卡资源。而若是使用迁移学习,你可以使用Google发布的Inception或VGG16这样成熟的物品分类的网络,只训练最后的softmax层,你只需要几千张图片,使用普通的CPU就能完成,而且模型的准确性不差。

迁移学习,一句话概述:就是站在巨人的肩膀上。顾名思义就是就是把已学训练好的模型参数迁移到新的模型来帮助新模型训练。考虑到大部分数据或任务是存在相关性的,所以通过迁移学习我们可以将已经学到的模型参数(也可理解为模型学到的知识)。通过某种方式来分享给新模型从而加快并优化模型的学习效率不用像大多数网络那样从零学习。

训练模型下载地址:
https://github.com/BVLC/caffe/wiki/Model-Zoo

注意点

使用迁徙学习时要注意,本来预训练的神经网络,要和当前的任务差距不大,不然迁徙学习的效果会很差。例如如果你要训练一个神经网络来识别肺部X光片中是否包含肿瘤,那么使用VGG16的网络就不如使用一个已训练好的判断脑部是否包含肿瘤的神经网络。

另一种迁移学习的方法是对整个网络进行微调,假设你已训练好了识别猫品种的神经网络,你的网络能对50种猫按品种进行分类。接下来你想对网络进行升级,让其能够识别100种猫,这时你不应该只训练网络的最后一层,而应该逐层对网络中每个节点的权重进行微调。显然,只训练最后几层,是迁移学习最简单的1.0版,而对节点权重进行微调(fine turing),就是更难的2.0版,通过将其他层的权重固定,只训练一层这样的逐层训练,可以更好的完成上述任务。

另一种迁移学习的方式是借用网络的结构,即不是使用已训练好的网络的权重,而是使用相同的网络结构,例如多少层,每层多少节点这样的信息,然后使用随机生成的权重作为训练的起点。

和传统的方法相比,迁移学习的另一个好处其可以做多任务目标的学习,传统的模型面对不同类型的任务,需要训练多个不同的模型。而有了迁移学习,可以先去实现简单的任务,将简单任务中的得到的知识应用到更难的问题上,从而解决标注数据缺少,标注不准确等问题。

迁移学习的分类

迁移学习
这幅图说明了该用哪种迁移学习:

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

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

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

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

在所有不同学科中,在所有深度学习不同的应用中,计算机视觉是一个你经常用到迁移学习的领域,除非你有非常非常大的数据集,你可以从头开始训练所有的东西。总之,迁移学习是非常值得你考虑的,除非你有一个极其大的数据集和非常大的计算量预算来从头训练你的网络。

猜你喜欢

转载自blog.csdn.net/hzk1562110692/article/details/88728582