版本

描述

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如下:

猫狗分类pytorch 准确率 猫狗分类问题_卷积

4. 对于V2版本

V2版本是在V1版本上增加了数据增强和添加了dropout层(网络其他层不变),数据增强使用了keras中的ImageDataGenerator来处理,dropout层则添加在V1网络模型的最后两个Dense层之前,其网络summary如下:

猫狗分类pytorch 准确率 猫狗分类问题_神经网络_02

5. 对于V3版本

在这一步起,抛弃了V1和V2中自定义网络的方式,改用在ImageNet上训练的VGG16预训练模型和自定义的分类器(即最后两层密集层)。当然预训练方式也有很多,预训练模式包括特征提取和微调模型两种方法,特征提取又分为分步式和合并式:

  • 1.特征提取
  • 1.1卷积基和分类器分步式
  • 1.2卷积基和分类器合并式
  • 2.微调模型

图像分类的卷积神经网络包括两部分:首先是一系列池化层和卷积层(称为卷积基),后是两个密集连接层(称为分类器)

特征提取可以简单理解为预训练网络中的多个卷积层(特征提取的工作主要由卷积层完成),所以特征提取的方法主要是利用预训练网络的卷积层(称为卷积基)。卷积基包括了预训练的卷积层,也包括其他比如pooling层。预训练网络VGG16的卷积基如下:

猫狗分类pytorch 准确率 猫狗分类问题_猫狗分类pytorch 准确率_03


而分类器则是指密集连接层,对于不同需要,网络的输出可能需要定义成不同的格式,所以分类器一般我们自己定义,如上图我们只用到VGG16的卷积基,没有用分类器,分类器我们自己定义。

如图,从图中我们可以介绍特征提取的两种方法:分步式和合并式

  • 分步式:(图三)我们将数据输入预训练的卷积基,得到卷积基的输出,再将卷积基的输出作为新分类器的输入,对新分类器进行训练。可以理解的是,对于卷积基我们只进行了前向运算,而对于新分类器则进行了训练,所以计算代价比较小(毕竟训练的大头再卷积基,而我们这里不需要训练卷积基,只需要前向运算)
  • 合并式:(图三)我们将数据输入整个网络(卷积基+新分类器),而不再像分步式保存中间结果。对整个网络经行训练,只不过在反向传播更新权值时只更新新分类器,而不更新卷积基。

 

  1. 对于V4版本

V4采用预训练-特征提取-合并式:
可以使用数据增强,但是计算代价大

7. 对于V5版本

V5采用微调模型,所谓的微调模型,是指按预训练-特征提取-合并式训练好的网络(冻结了整个卷积基,只训练了分类器),我们再次训练,只不过现在我们解冻卷积基的后面几层卷积层,并调低学习率(使得权值更新时波动较小)。

我们做个比较:
V4:“卷积基-分类器”:只训练分类器,也就是只更新分类器的权值
V5:“卷积基(前部分)-卷积基(后部分)-分类器”:只训练卷积基(后部分)和分类器(并且学习率更小,否则怎么叫微调)

为什么要微调?类似显微镜先粗调找到细菌范围,再细调调节清楚。对于V5先使用预训练-特征提取-合并式训练粗调(虽然精度也可以,但是细调后精度更高),再使用微调模型方法细调,所以学习率更小,使得权重小范围更新