在前面的文章中,咱们一般是拿到一个任务,譬如图像分类、识别等,搜集好数据后就开始直接用模型进行训练,可是现实状况中,因为设备的局限性、时间的紧迫性等致使咱们没法从头开始训练,迭代一两百万次来收敛模型,因此这个时候迁移学习就派上用场了。git
什么是迁移学习?github
为何须要迁移学习?数据库
新数据集相比于原数据集更小但内容很不相同。因为数据较小,只训练一个线性分类器可能更好。由于数据集不一样,从网络顶部就开始训练分类器可能不是最好的选择,这包含更多的数据集特定特征。另外,从网络前部的激活函数开始训练分类器可能更好一点。网络
新数据集相比于原数据集较大,但内容很是不一样。因为数据集很大,咱们可能会指望从头开始训练一个 DCNN。然而,在实践中从一个预训练模型开始初始化权重仍然是一种有益的方法。在这种状况下,咱们会有足够的数据和信心对整个网络进行微调。架构
如何作迁移学习?dom
在实践中,咱们一般不会彻底从头开始随机初始化训练 DCNN,这是由于有能知足深度网络需求的足够大小的数据集至关的少见。做为代替,常见的是在一个大型数据集上预训练一个 DCNN,而后使用这一训练的 DCNN 的权重做为初始设置或做为相关任务的固定的特征提取器。 举个例子,咱们知道Imagnet是目前最大的图像识别数据库,目前已经有不少基于imagenet数据训练的网络模型,如inceptionv三、v4等,假如如今给你一个任务,但愿你能作一个车系识别,你有两个选择:机器学习
一是搜集大量的车系数据,对这些车系数据进行模型训练;函数
二是基于imagenet训练好的网络模型,而后把搜集好的车系数据加到基于以前训练好的模型继续训练,进行fine-tuning。学习
传统的作法都是第一种,可是这就会遇到一个问题,一是车系的图片够不够多,体量够不够大?若是数据量不够,最后训练的效果会不会很很差?其实咱们能够经过 把ImageNet 或其余大型数据集学习到的网络特征运用于一个图片分类或其余基于图片特征的任务,这就是迁移学习的思想。其实能够这样理解,若是从零开始训练,那么初始化权重通常状况下要么是都为0,要么随机设置,当咱们导入了在大规模数据集上训练好的模型后,至关于在以这个模型现有的参数做为初始化的权重,不过至于在具体的任务上的泛化能力如何,仍是得看具体的场景。spa
迁移学习的限制
上文提到咱们在迁移学习中会使用预训练的网络,因此咱们在模型架构方面受到了一点点限制。好比说,咱们不能随意移除预训练网络中的卷积层。但因为参数共享的关系,咱们能够很轻松地在不一样空间尺寸的图像上运行一个预训练网络。这在卷积层和池化层和状况下是显而易见的,由于它们的前向函数(forward function)独立于输入内容的空间尺寸。在全链接层(FC)的情形中,这仍然成立,由于全链接层可被转化成一个卷积层。因此当咱们导入一个预训练的模型时,网络结构须要与预训练的网络结构相同,而后再针对特定的场景和任务进行训练。
迁移学习的相关资料
对迁移学习感兴趣的同窗,能够关注这个github repo:transferlearning,以及王晋东写的系列文章:
《小王爱迁移》系列之六:学习迁移(Learning To Transfer)
《小王爱迁移》系列之七:负迁移(Negative Transfer)
《小王爱迁移》系列之九:开放集迁移学习(Open Set Domain Adaptation)
《小王爱迁移》系列之十:张量迁移学习(tensor unsupervised domain adaptation)
《小王爱迁移》系列之十一:选择性对抗迁移学习(Selective Adversarial Network)
《小王爱迁移》系列之十二:新年新气象-从新整理的迁移学习资源仓库
参考资料:
1.https://zhuanlan.zhihu.com/p/33369085
2.http://blog.csdn.net/maweifei/article/details/52444342