背景
在上一篇文章我们引用了VGG16模型,通过删除其全连接层,再加上自己的全连接层进行训练,达到了90%的正确率。但是还有一种方法,就是微调模型,这个方法配合特征提取可以达到一个更好的高度。
什么是微调模型呢?就是通过解冻VGG16最后的几层,通过与训练好的全连接层联合训练的方式,来达到我们的目的,也就是对已经训练好的网络进行微调。
为什么只解冻后边几层呢?如果了解过卷积神经网络的话,我们可以知道,网络越是靠后,它提取出来的特征越是笼统,越是靠前,它提取的特征越散,总结来说修改哪里其实都是能提高正确率的,但是,修改前边的网络性价比很低,相比于修改后边的网络,效果不是那么显著,而且我觉得牵一发而动全身,前边的网络都改了后边的怎么能不改呢。
数据准备
猫狗识别的数据,kaggle比赛
训练集2000张
验证集1000张
步骤
- 在已经训练好的网络上添加自定义网络。(特征提取)
- 冻结基网络
- 训练所添加的部分
- 解冻基网络的一些层
- 联合训练解冻的这些层和添加的部分
在猫狗识别(三)中,我们实现了前三个步骤,使用VGG16网络+自己写一个全连接层,冻结VGG16网络后进行训练,训练好后将VGG16的卷积块5解冻,调小学习率,再进行训练。
代码
代码的改动不多,主要分为下边几个部分:
卷积块5的解冻:
conv_base.trainable = True
set_trainable = False
for layer in conv_base.layers:
if layer.name == 'block5_conv1':
set_trainable = True
if set_trainable =