1微调原理
在自己的数据集上训练一个新的深度学习模型时,一般采取在预训练ImageNet上进行微调的方法。什么是微调?这里以VGG16为例进行讲解。
图1.1VGG16结构示意图
如图1.1所示,VGG16的结构为卷积层+全连接层。卷积层分为五个部分,共13层,即图中的conv1~conv5。还有全连接层fc6、fc7、fc8。卷积层加上全连接层总共16层,因此被称为VGG16。如果要将VGG16的结构用于一个新的数据集,首先要去掉fc8这一层,因为fc8这一层输入的是fc7这一层的特征,输出是1000类的概率,这1000类正好对应的是ImageNet模型中的1000个类别,在自己的数据集中一般不是1000类,因此fc8是不适用的,必须将fc8去掉,重新采用适合数据集类别的全连接层,作为新的fc8全连接层,比如数据集为6类,那么新的fc8的输出应当是6类。
此外,在训练的时候,网络参数的初始值并不是随机生成的,而是采用VGG16在ImageNet上已经训练好的参数作为训练的初始值。这样做的原因在于,在ImageNet数据集上训练过的VGG16中的参数已经包含了大量有用的卷积过滤器,与其从零开始初始化VGG16的所有参数,不如使用自己已经训练好的参数作为训练的起点。这样做不仅节约了大量的训练时间,而且还有助于分类器性能的提高。
载入VGG16的参数后,就可以开始训练了,此时需要指定训练层数的范围,一般可以选择以下几种范围进行训练:
a. 只训练fc8。训练范围一定要包含fc8这一层,前面讲过,fc8结构被调整过,因此它的参数不能直接从ImageNet预训练模型中取得,可以只训练fc8层,保持其它层的参数不变,这样就相当于将VGG16当做一个“特征提取器”:用fc7层提取的特征做一个softmax模型分类。这样做的好处是训练速度快,但往往性能不会太好。
b. 训练所有参数。还可以对网络中所有的参数进行训练,这种方法的训练速度可能会比较慢,但是能提取较高的性能,可以充分发挥深度模型的威力。
c. 训练部分参数。通常是固定浅层参数不变,训练浅层参数。如训练conv1、conv2的部分参数不变,只训练conv3、conv4、conv5、fc6、fc7、fc8。
这种训练方法就是所谓的对神经网络模型做微调,借助微调可以从预训练模型出发,将神经网络应用到自己的数据集上。
2数据准备
首先要做一些数据准备方面的工作:一是把数据集切分为训练集和验证集,二是转换为tfrecord格式。在data_prepare/文件夹中提供了会用到的数据集和代码。
首先要将自己的数据集切分为训练集和验证集。验证集用于验证模型的准确率,本博客用了一个实验的卫星图片分类数据集,这个数据集一共有六个类。点击打开数据集链接。
在data_prepare文件夹下,使用预先编译好的脚本data_convert.py,将图片转换为tfrecord格式。