基于AlexNet的猫狗数据集识别

摘要:AlexNet网络是由多伦多大学的Alex Krizhevsky设计并实现的,用于参与2012年的ILSVRC2012图像分类大赛。该比赛,神经网络在LeNet-5应用于MINIST数据集之后,是CNN卷积神经网络在首次亮相,并被应用到到大规模图像数据集上。为了参加该比赛,Alex Krizhevsky领导的团队训练了一个前所未有的神将网络以对ImageNet LSVRC竞赛的120万张图片分成1000个类。Alex Krizhevsky团队使用这个模型的一个变种参加了ILSVRC-2012竞赛,赢得了冠军并且与第二名 top-5 26.2%的错误率相比,AlexNet网络取得了top-5 15.3%的错误率。本文将通过介绍AlexNet网络的产生,以及发展历史。理解学习AlexNet模型的构建过程,训练原理,最后迁移到其他数据集上进行一个分类推理和训练。在我的猫狗数据集的迁移训练中,取得了96.80%准确率的好成绩。

**

1 引言

**
早在1989年,Yann LeCun (现纽约大学教授)和他的同事们就发表了卷积神经网络(Convolution NeuralNetworks, 简称CNN)的工作。在很长时间里,CNN虽然在小规模的问题上,如手写数字,取得过当时世界最好结果,但一直没有取得巨大成功。这主要原因是,CNN在大规模图像上效果不好,比如像素很多的自然图片内容理解,所以没有得到计算机视觉领域的足够重视。
在2012年以前,目标识别方法基本上都使用了机器学习方法。为了提高目标识别的性能,我们可以收集更大的数据集,学习更强大的模型,使用更好的技术来防止过拟合。在2012年之前标注图像的数据集都相对较小—在几万张图像的数量级上(例如,NORB,Caltech-101/256 [和CIFAR-10/100 )。简单的识别任务在这样大小的数据集上可以被解决的相当好,尤其是如果通过标签保留变换进行数据增强的情况下。例如,在MNIST数字识别任务上(<0.3%)的最好准确率已经接近了人类水平。但真实环境中的对象表现出了相当大的可变性,因此为了学习识别它们,有必要使用更大的训练数据集。因为小图像数据集的缺点已经有目共睹,但收集上百万图像的标注数据仅在2012年才变得的可能。新的更大的数据集包括LabelMe ,它包含了数十万张完全分割的图像,ImageNet,它包含了22000个类别上的超过1500万张标注的高分辨率的图像。
为了从数百万张图像中学习几千个对象,就必须需要一个有很强学习能力的模型。然而对象识别任务的巨大复杂性意味着这个问题不能被指定,即使通过像ImageNet这样的大数据集,因此我们的模型应该也有许多先验知识来补偿我们所没有的数据。卷积神经网络(CNNs)被探索用来构建这样的模型。它们的能力可以通过改变它们的广度和深度来控制,它们也可以对图像的本质进行强大且通常正确的假设(也就是说,统计的稳定性和像素依赖的局部性)。因此,与具有层次大小相似的标准前馈神经网络,CNNs有更少的连接和参数,因此它们更容易训练,而它们理论上的最佳性能可能仅比标准前馈神经网络差一点。
因此在科技进步带来的巨大算力进步的加持下,Krizhevsky设计的神经网络在图像处理领域掀起了复活CNN的浪潮。可以说,AlexNet是卷积神经网络重新开始的标志,具有里程碑式的意义。

2 AlexNet架构*

如下图所示,它包含八个学习层–5个卷积层和3个全连接层。下面,我们将描述我们网络结构中的一些新奇的不寻常的特性。并按照小节对网络结构进行解读。
2.1 ReLU—非线性激活函数在AlexNet中的应用
将神经元输出f建模为输入x的函数的标准方式是用f(x)=tanh⁡(x)或f(x)=(1+e^(-x) )-1。考虑到梯度下降的训练时间,这些饱和的非线性比非饱和非线性f(x) = max(0,x)更慢。根据Nair和Hinton的说法,将这种非线性神经元称为修正线性单元(ReLU)。采用ReLU的深度卷积神经网络训练时间比等价的tanh单元要快几倍。如图1中,对于一个特定的四层卷积网络,Krizhevsky使用AlexNet卷积网路在CIFAR-10数据集上达到25%的训练误差所需要的迭代次数可以证实这一点。这幅图表明,如果我们采用传统的饱和神经元模型,我们将不能在如此大的神经网络上实验该工作。

基于AlexNet的猫狗数据集识别_第1张图片
图.1 使用relu函数对比
图1:使用ReLU的四层卷积神经网络在CIFAR-10数据集上达到25%的训练误差比使用tanh神经元的等价网络(虚线)快六倍。为了使训练尽可能快,每个网络的学习率是单独选择的。没有采用任何类型的正则化。影响的大小随着网络结构的变化而变化,这一点已得到证实,但使用ReLU的网络都比等价的饱和神经元快几倍。
实际上,在2012年之前,就有人在考虑在卷积神经网络上使用ReLu,并且取得了一定的成效。

2.2 多GPU训练
受制于当时的硬件条件,一块GPU无法满足在今天看起来很浅的网络的训练。该团队运用了两块GPU分开来训练该网络。当然在今天,专业团队在进行网络训练的时候是不需要再做出如此拮据的举措。

2.3 重叠池化
CNN中的池化层归纳了同一核映射上相邻组神经元的输出。习惯上,相邻池化单元归纳的区域是不重叠的。更确切的说,池化层可看作由池化单元网格组成,网格间距为个像素,每个网格归纳池化单元中心位置 大小的邻居。通常在CNN中采用的传统局部池化,如果设置,我们会得到重叠池化。这就是我们网络中使用的方法,设置池化层。这个方案分 别降低了top-1 0.4%,top-5 0.3%的错误率,与非重叠方案相比,输出的维度是相等的。我们在训练过程中通常观察采用重叠池化的模型,发现它更难过拟合。

2.4 整体架构
现在来描述下AlexNet的整体架构,如下图所示。
基于AlexNet的猫狗数据集识别_第2张图片
图2.AlexNet卷积神经网络架构
整个网络包含8个带权重的层;前5层是卷积层,剩下的3层是全连接层。最后一层全连接层的输出是1000维softmax的输入,softmax会产生1000类标签的分布。网络最大化多项逻辑回归的目标,等价于最大化预测分布下训练样本正确标签的对数概率的均值。
第2,4,5卷积层的核只与位于同一GPU上的前一层的核映射相连接(看图2)。第3卷积层的核与第2层的所有核映射相连。全连接层的神经元与前一层的所有神经元相连。第1,2卷积层之后是响应归一化层。3.4节描述的这种最大池化层在响应归一化层和第5卷积层之后。ReLU非线性应用在每个卷积层和全连接层的输出上。
第1卷积层使用96个核对224 × 224 × 3的输入图像进行滤波,核大小为11 × 11 × 3,步长是4个像素(核映射中相邻神经元感受野中心之间的距离)。第2卷积层使用用第1卷积层的输出(响应归一化和池化)作为输入,并使用256个核进行滤波,核大小为5 × 5 × 48。第3,4,5卷积层互相连接,中间没有接入池化层或归一化层。第3卷积层有384个核,核大小为3 × 3 × 256,与第2卷积层的输出(归一化的,池化的)相连。第4卷积层有384个核,核大小为3 × 3 × 192,第5卷积层有256个核,核大小为3 × 3 × 192。每个全连接层有4096个神经元。

**

3 减少过拟合

**
3.1 数据增强
在AlexNet的训练过程中,该团队采取了两种数据增强的方式:
第一种数据增强方式包括产生图像变换和水平翻转。我们从256×256图像上通过随机提取224 × 224的图像块实现了这种方式,然后在这些提取的图像块上进行训练。这通过一个2048因子增大了我们的训练集,尽管最终的训练样本是高度相关的。没有这个方案,我们的网络会有大量的过拟合,这会迫使我们使用更小的网络。在测试时,网络会提取5个224 × 224的图像块。
第二种是改变训练图像的RGB通道的强度。具体的,我们在整个ImageNet训练集上对RGB像素值集合执行PCA。对于每幅训练图像,我们加上多倍找到主成分,大小成正比的对应特征值乘以一个随机变量,随机变量通过均值为零,标准差为一的高斯分布得到。

3.2 失活(Dropout)
将许多不同模型的预测结合起来是降低测试误差的一个非常成功的方法,但对于需要花费几天来训练的大型神经网络来说,这似乎太奢侈和浪费了。在该文章中,有一个非常有效的模型结合版本,它只花费两倍的训练成本。这种最近引入的技术,叫做“dropout”,它会以0.5的概率对每个隐层神经元的输出设出0。那些“失活的”的神经元不再进行前向传播并且不参与反向传播。因此每次输入时,神经网络会采样一个不同的架构,但所有架构共享权重。这个技术减少了复杂的神经元互适应,因为一个神经元不能依赖特定的其它神经元的存在。因此,神经元被强迫学习更鲁棒的特征,它在与许多不同的其它神经元的随机子集结合时是有用的。在测试时,我们使用所有的神经元但它们的输出乘以0.5,对指数级的许多失活网络的预测分布进行几何平均,这是一种合理的近似。
我们在神经网络的前两个全连接层使用失活。如果没有失活,我们的网络表现出大量的过拟合。失活大致上使要求收敛的迭代次数翻了一倍,但是性能得到了极大的提升。

4 AlexNet网络总结

近年来,随着深度学习研究的深入和计算机算力的极大提升,更多高效、快速的网络已成为主流,甚至很多网络开始了极其变态的图像增强技术,如GoogLeNet可以将一张图片增强至144张等。但是AlexNet网络,这开启了卷积神经网络新时代的初代神经网络,成为了一些新的神经网络的基础。

5 AlexNet在猫狗数据集上的实验结果与分析

5.1 猫狗数据集
猫狗数据集中包含了25000张图片,其中训练集2250(0.9)张,测试集2500(0.1)张。该数据集是Kaggle中一个比赛提供的,主要为各种场景下的猫狗图片。选择此数据集,是因为只需将结果分为两类,分类数目不多;其次是数据集大小合适,便于我们作为平常的实验使用。

5.2 基于AlexNet在ImageNet预训练模型上的图片推理
在进行网络训练前,我们先搭建了一个基于预训练模型的推理网络,经过简单的调用预训练模型,得到了一个推理模型,用来预测输入的未知图片的top5分类情况。
输入图片如下:
基于AlexNet的猫狗数据集识别_第3张图片
图3. 老虎

基于AlexNet的猫狗数据集识别_第4张图片
图4. 金毛犬
预测结果如下:
基于AlexNet的猫狗数据集识别_第5张图片
图5.top5分类
基于AlexNet的猫狗数据集识别_第6张图片
图5.预测top5种类
在这个推理过程中,金毛预测时间3.07s,老虎预测时间1.84s正确率均100%。

5.3 AlexNet在猫狗数据集上的训练
猫狗数据集图像并不复杂,主要由猫和狗构成,在构建网络时,我们将最后的输出层种类改为两类,并设置合理的超参数即可。
采用英伟达GTX1660ti,参数设置如下:
第一次:
num_classes = 2 分类数量
MAX_EPOCH = 9 训练次数
BATCH_SIZE = 256 批数量
LR = 0.001 学习率
log_interval = 1 打印当前训练情况
val_interval = 1 在多少个epoch之运行验证集
start_epoch = -1 起始epoch序号
lr_decay_step = 1 学习率经多少个epoch修改一次

实验结果:
Loss: 0.0763 Acc:96.78%

基于AlexNet的猫狗数据集识别_第7张图片

第二次:
num_classes = 8 分类数量
MAX_EPOCH = 15 训练次数
BATCH_SIZE = 384 批数量(BS=512电脑内存不够用)
LR = 0.001 学习率
log_interval = 1 打印当前训练情况
val_interval = 1 在多少个epoch之运行验证集
start_epoch = -1 起始epoch序号
lr_decay_step = 1 学习率经多少个epoch修改一次

实验结果:
Loss: 0.0805 Acc:96.88%
基于AlexNet的猫狗数据集识别_第8张图片

6 实验结论

6.1创新点
1.采用RELU加快大型神经网络训练
2.采用LRN提升大型神经网络泛化能力
3.采用Overlapping Pooling提升指标
4.采用随机裁剪翻转及色彩扰动增加数据多样性
5.采用Dropout减轻过拟合

6.2 启发点
1.深度和宽度可以决定网络能力
2.更强大的GPU及更多的数据可以进一步提高模型性能
3.图片缩放细节:对短边进行先行缩放
4.RELU不需要对输入进行标准化来防止饱和现象,即说明Sigmoid/tanh激活函数有必要对输入进行标准化
5.卷积核学习到频率,方向和颜色特征
6.相似图片具有“相近”的高级特征
7.图像检索可基于高级特征,效果应该要优于基于原始图像
8.网络结构具有相关性,不可轻易移除某一层
9.采用视频数据可能会有新的突破

6.3 实验结果思考
通过两次实验对比我们可以看到,不同超参数的设定对训练结果的影响。当计算机算力能够跟上的情况下,多的epoch和大的Batch-size都有利于提高训练结果。对比于同实验室的另一组实验—基于GoogLeNet的鱼类数据识别。因其数据集数量较少,且网络更深更大。虽然有着GoogLeNet优异的网络结构,仍是不能有很好的准确率和训练效果。可以看出,现代深度学习对于算力和好的Idea的依赖。

声明

本文参考了AlexNet论文原文及一些网络资料,如果我个人侵权请及时与我联系。也欢迎大家一起交流,分享学习体会,相关代码及数据集可以私聊我进行沟通。

你可能感兴趣的:(pytorch,神经网络,深度学习)