版本 | 描述 | epochs | 训练精度 | 验证精度 |
V1.0 | 简单线性卷积神经网络 | 100 | 99% | 75% |
V2.0 | 添加了数据增强和dropout层 | 100 | 83% | 83% |
V3.0 | 使用预训练-特征提取-分步式 | 100 | 99% | 90% |
V4.0 | 使用预训练-特征提取-合并式 | 100 | 90% | 90% |
V5.0 | 使用预训练-微调模型 | 100 | 99% | 94% |
我会针对每个版本都做详细介绍和给出代码,在这里我先对每个版本和使用的方法做个统一介绍,能有个大致了解
2. 使用的数据集
kaggle的猫狗数据集:包含25000张图像(每类别有12500张),但是我们只用一部分图像(共4000张,每类2000张):
猫:
训练集:1000张(0~1000张)
验证集:500张(1000~1500张)
测试集:500张(1500~2000张)
狗
训练集:1000张
验证集:500张
测试集:500张
文件夹结构:
--dogs-vs-cats_small
--train
--cats
--dogs
--validation
--cats
--dogs
--test
--cats
--dogs
3. 对于V1版本
V1版本中作者使用keras搭建了一个简单线性卷积神经网络,网络summary如下:
4. 对于V2版本
V2版本是在V1版本上增加了数据增强和添加了dropout层(网络其他层不变),数据增强使用了keras中的ImageDataGenerator来处理,dropout层则添加在V1网络模型的最后两个Dense层之前,其网络summary如下:
5. 对于V3版本
在这一步起,抛弃了V1和V2中自定义网络的方式,改用在ImageNet上训练的VGG16预训练模型和自定义的分类器(即最后两层密集层)。当然预训练方式也有很多,预训练模式包括特征提取和微调模型两种方法,特征提取又分为分步式和合并式:
- 1.特征提取
- 1.1卷积基和分类器分步式
- 1.2卷积基和分类器合并式
- 2.微调模型
图像分类的卷积神经网络包括两部分:首先是一系列池化层和卷积层(称为卷积基),后是两个密集连接层(称为分类器)
特征提取可以简单理解为预训练网络中的多个卷积层(特征提取的工作主要由卷积层完成),所以特征提取的方法主要是利用预训练网络的卷积层(称为卷积基)。卷积基包括了预训练的卷积层,也包括其他比如pooling层。预训练网络VGG16的卷积基如下:
而分类器则是指密集连接层,对于不同需要,网络的输出可能需要定义成不同的格式,所以分类器一般我们自己定义,如上图我们只用到VGG16的卷积基,没有用分类器,分类器我们自己定义。
如图,从图中我们可以介绍特征提取的两种方法:分步式和合并式
- 分步式:(图三)我们将数据输入预训练的卷积基,得到卷积基的输出,再将卷积基的输出作为新分类器的输入,对新分类器进行训练。可以理解的是,对于卷积基我们只进行了前向运算,而对于新分类器则进行了训练,所以计算代价比较小(毕竟训练的大头再卷积基,而我们这里不需要训练卷积基,只需要前向运算)
- 合并式:(图三)我们将数据输入整个网络(卷积基+新分类器),而不再像分步式保存中间结果。对整个网络经行训练,只不过在反向传播更新权值时只更新新分类器,而不更新卷积基。
- 对于V4版本
V4采用预训练-特征提取-合并式:
可以使用数据增强,但是计算代价大
7. 对于V5版本
V5采用微调模型,所谓的微调模型,是指按预训练-特征提取-合并式训练好的网络(冻结了整个卷积基,只训练了分类器),我们再次训练,只不过现在我们解冻卷积基的后面几层卷积层,并调低学习率(使得权值更新时波动较小)。
我们做个比较:
V4:“卷积基-分类器”:只训练分类器,也就是只更新分类器的权值
V5:“卷积基(前部分)-卷积基(后部分)-分类器”:只训练卷积基(后部分)和分类器(并且学习率更小,否则怎么叫微调)
为什么要微调?类似显微镜先粗调找到细菌范围,再细调调节清楚。对于V5先使用预训练-特征提取-合并式训练粗调(虽然精度也可以,但是细调后精度更高),再使用微调模型方法细调,所以学习率更小,使得权重小范围更新