使用预训练的卷积神经网络

想要将深度学习应用于小型图像数据集,使用预训练网络就是一种常用且高效的方法。

预训练网络就是一个保存好的网络,之前已在大型数据集上训练(通常是大规模图像分类任务)。

如果训练的原始数据集足够大且足够通用(如imagenet数据集),那么预训练网络学到的特征的空间层次结构可以有效的作为视觉世界的通用模型,因此这些特征可用于不同的计算机视觉问题。

这种学习到的特征在不同问题之间的可移植性,也是深度学习与其他浅层方法相比的重要优势。

使用预训练网络有两种方法,特征提取和微调模型。

特征提取是使用之前网络学到的表示来从新样本中提取有趣的特征。

如前所述,用于图像分类的卷积神经网络包含两部分:首先是一系列池化层和卷积层,然后是一个密集连接分类器。第一部分叫做模型的卷积基。特征提取就是取出之前训练好网络的卷积基,在上面运行新数据,得到输出的高级特征。

注意,某个卷积层提取的表示的通用性(以及可复用性)取决于该层在模型中的深度。模型中越靠近底部的层提取的是局部的高度通用的特征图(比如视觉边缘、颜色和纹理),而越靠近顶部的层提取的是更加抽象的概念(比如“猫耳朵”或“狗眼睛”)。因此,如果你的新数据集与原始数据集有很大差异,那么最好直选用模型的前几层来做特征提取,而不是使用整个卷积基。

利用特征提取来进行新的任务,有两种方法可供选择:

一、在新的数据集上运行卷积基,将得到的输出保存为numpy数组,然后用这个数据作为输入,输入到独立的密集连接层中,这种方法速度快,计算代价低。但不允许使用数据增强。

二、在顶部添加Dence层来扩展已有模型(训练时冻结卷积基),并在输入数据上进行端对端地运行整个模型。这种方法可以使用数据增强,但计算代价比第一种方法高很多。(虽然训练时卷积基的参数固定,但Dence层的参数优化时依旧需要往前传播,由于卷积基比较深,所以计算量会大很多;而第一种方法Dence层参数优化时不需要经过卷积基)

微调模型是用于特征提取的冻结的卷积基,将其顶部的几层“解冻”,并将这几层和新增加的Dence层一起联合训练。

之所以叫微调,是因为它只是略微调整了所复用模型中更加抽象的表示,以便让这些表示与新的任务更加相关。

微调模型的步骤如下:

1)在已经训练好的基网络上添加自定义网络;

2)冻结基网络;

3)训练所添加的部分;

4)解冻基网络的一些层;

5)联合训练解冻的这些层和添加的部分。

微调层数需要考虑以下两点:

1.卷积基中靠近底部的层编码是更加通用的可复用特征,而靠近顶部的层编码是更加专业化的特征。微调这些更专业化的特征更加有用。微调越靠近底部的层,得到的回报越少。

2.训练的参数越多,过拟合的风险越大。

一个好策略是仅微调卷积基的最后两三层。

你可能感兴趣的:(使用预训练的卷积神经网络)