迁移学习

迁移学习 和 微调

迁移学习是一个比较宽泛的领域,就是把已学训练好的模型参数迁移到新的模型来帮助新模型训练。考虑到大部分数据或任务是存在相关性的,所以通过迁移学习我们可以将已经学到的这种对图像分类识别的理解力,通过某种方式来分享给新模型,神经网络从数据中获得信息,进而把它们转换成相应的权重。这些权重能够被提取出来,迁移到其他的神经网络中,从而加快并优化模型的学习效率,迅速收敛,我们“迁移”了这些学来的特征,就不需要从零开始训练一个神经网络了。这个过程可以看做是老手与新手之间的“信息转移”。

两者之间的关系是迁移学习别人的知识,根据自己的实际情况微调知识化为己用。这就好比,使用“吸星大法”吸收了别人的功力之后,好歹也得打坐盘膝,调理一下不是?

 微调模型的方法

一个深度学习模型可以表达为【特征提取器+分类器】,而特征提取器有【低级特征提取器】和【高级特征提取器】,此时深度学习模型就等价于【低级特征提取器+高级特征提取器+分类器】。因此在公开的已有训练好的模型情况下,针对一个新问题,我们完全可以进行利用,但无论特征提取器是否适用该问题,分类器基本上都需要重新设置以适应当前的分类问题。既然分类器已经换成自己的,那接着自然面临着要进行部分参数的训练。

1.特征提取:将预训练模型当做特征提取装置来使用。具体的做法是,将输出层去掉,然后将剩下的整个网络当做一个固定的特征提取机,从而应用到新的数据集中。


2.采用预训练模型的结构:先将所有的权重随机化,然后依据自己的数据集进行训练。

3.训练特定层,冻结其他层:进行部分训练。具体的做法是,将模型起始的一些层的权重保持不变,重新训练后面的层,得到新的权重。在这个过程中,我们可以多次进行尝试,从而能够依据结果找到frozen layers和retrain layers之间的最佳搭配。


如何使用和训练模型,是由数据集大小和其之间的相似度来决定的,一般分为几种情况:

场景一:数据集小,数据相似度高(与pre-trained model的训练数据相比而言)

在这种情况下,因为数据与预训练模型的训练数据相似度很高,因此我们不需要重新训练模型。我们只需要将输出层改制成符合问题情境下的结构就好。我们使用预处理模型作为模式提取器。比如说我们使用在ImageNet上训练的模型来辨认一组新照片中的小猫小狗。在这里,需要被辨认的图片与ImageNet库中的图片类似,但是我们的输出结果中只需要两项——猫或者狗。在这个例子中,我们需要做的就是把dense layer和最终softmax layer的输出从1000个类别改为2个类别。

场景二:数据集小,数据相似度不高

在这种情况下,我们可以冻结预训练模型中的前k个层中的权重,然后重新训练后面的n-k个层,当然最后一层也需要根据相应的输出格式来进行修改。因为数据的相似度不高,重新训练的过程就变得非常关键。而新数据集大小的不足,则是通过冻结预训练模型的前k层进行弥补。

场景三:数据集大,数据相似度不高
在这种情况下,因为我们有一个很大的数据集,所以神经网络的训练过程将会比较有效率。然而,因为实际数据与预训练模型的训练数据之间存在很大差异,采用预训练模型将不会是一种高效的方式。因此最好的方法还是将预处理模型中的权重全都初始化后在新数据集的基础上重头开始训练。

场景四:数据集大,数据相似度高

这就是最理想的情况,采用预训练模型会变得非常高效。最好的运用方式是保持模型原有的结构和初始权重不变,随后在新数据集的基础上重新训练。

预训练模型

pre-trained model 是前人为了解决类似问题所创造出来的模型。你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手。比如说,如果你想做一辆自动驾驶汽车,可以花数年时间从零开始构建一个性能优良的图像识别算法,也可以从Google在ImageNet数据集上训练得到的inception model(一个预训练模型)起步,来识别图像。一个预训练模型可能对于你的应用中并不是100%的准确对口,但是它可以为你节省大量功夫。

大数据集上训练好的预训练模型,可以直接使用其相应的结构和权重,应用到我们正在面对的问题上。这被称作迁移学习,即将预训练的模型迁移到我们正在应对的特定问题中。在选择预训练模型的时候需要非常仔细,如果你的问题与预训练模型训练情景下有很大的出入,那么模型所得到的预测结果将会非常不准确。举例来说,如果把一个原本用于语音识别的模型用来做用户识别,那结果肯定是不理想的。ImageNet数据集已经被广泛用作训练集,因为它规模足够大(包括120万张图片),有助于训练普适模型。在迁移学习中,实践证明这些预训练的网络对于ImageNet数据集外的图片也表现出了很好的泛化性能。既然预训练模型已经训练得很好,我们就不会在短时间内去修改过多的权重,在迁移学习中用到它的时候,往往只是进行微调(fine tune)。在修改模型的过程中,我们通过会采用比一般训练模型更低的学习速率

你可能感兴趣的:(目标检测模型)