一、为什么需要使用预训练模型?
当可用的数据集较少时,我们从头开始训练的自己的卷积神经网络,想要将模型的精度会十分困难,如果我们想要进一步提高精度,因此下一步我们需要使用预训练的模型。
想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络----python深度学习
二、什么是预训练模型?
顾名思义,预训练模型就是之前训练好的模型。预训练模型是一个训练并保存好的模型,之前在大型数据集上进行的训练。如果训练集足够大,那么该模型会具有普适性,即是一个通用的模型,即使在我们新的问题上涉及到新的类别,那也无妨。
三、怎么使用预训练网络?
使用预训练网络有两种方法:特征提取(feature extraction)和微调模型(fine-tuning)。
1、特征提取
特征提取是使用之前网络学到的表示来从新样本中提取出有趣的特征。然后将这些特征输入一个新的分类器,从头开始训练。
用于图像分类的卷积神经网络包含两部分:首先是一系列池化层和卷积层,最后是一个密集连接分类器。第一部分叫作模型的卷积(convolutional base)。对于卷积神经网络而言,特征提取就是取出之前训练好的网络的卷积基,在上面运行新数据,然后在输出上面训练一个新的分类器。如图一所示:卷积基不变,改变分类器
为什么只使用预训练模型的卷积基?
原因在于卷积基学到的表示可能更加通用,因此更适合重复使用。分类器学到的表示必然是针对于模型训练的类别,其中仅包含某个类别出现在整张图像中的概率信息,因此预训练模型密集连接层的特征在很大程度上是无用的。
如何进行特征提取(两种方法实现)
- 在你的数据集上运行卷积基,将输出保存成硬盘中的 Numpy 数组,然后用这个数据作为输入,输入到独立的密集连接分类器中(与本书第一部分介绍的分类器类似)。
优点:速度快,计算代价低,因为对于每个输入图像只需运行一次卷积基。
缺点:不允许你使用数据增强。 - 在顶部添加 Dense 层来扩展已有模型(即 conv_base),并在输入数据上端到端地运行整个模型。
优点:可以使用数据增强。
缺点:计算代价高,因为每个输入图像进入模型时都会经过卷积基。
注意:第二种方法要“冻结”卷积基,冻结(freeze)一个或多个层是指在训练过程中保持其权重不变。如果不这么做,那么卷积基之前学到的表示将会在训练过程中被修改。因为其上添加的 Dense 层是随机初始化的,所以非常大的权重更新将会在网络中传播,对之前学到的表示造成很大破坏。
2、微调模型
模型微调(fine-tuning)与特征提取互为补充。对于用于特征提取的冻结的模型基,微调是指将其顶部的几层“解冻”,并将这解冻的几层和新增加的部联合训练。之所以叫作微调,是因为它只是略微调整了所复用模型中更加抽象的表示,以便让这些表示与手头的问题更加相关。
只有上面的分类器已经训练好了,才能微调卷积基的顶部几层。如果分类器没有训练好,那么训练期间通过网络传播的误差信号会特别大,微调的几层之前学到的表示都会被破坏。因此,微调网络的步骤如下。
(1) 在已经训练好的基网络(base network)上添加自定义网络。
(2) 冻结基网络。
(3) 训练所添加的部分。
(4) 解冻基网络的一些层。
(5) 联合训练解冻的这些层和添加的部分。
为什么不微调更多层?为什么不微调整个卷积基?
(1)卷积基中更靠底部的层编码的是更加通用的可复用特征,而更靠顶部的层编码的是更专业化的特征。微调这些更专业化的特征更加有用,因为它们需要在你的新问题上改变用途。微调更靠底部的层,得到的回报会更少。
(2)训练的参数越多,过拟合的风险越大。卷积基有 1500 万个参数,所以在你的小型数据集上训练这么多参数是有风险的。