利用CNN进行图像分类学习笔记

来源:互联网 发布:centos 查看进程流量 编辑:程序博客网 时间:2024/04/29 05:02

利用CNN进行图像分类学习笔记

学习的文章:

Krizhevsky A, Sutskever I, Hinton G E. Imagenetclassification with deep convolutional neural networks[C]//Advances in neuralinformation processing systems. 2012: 1097-1105.

1. 文章的贡献

        本文训练了一个大的深度卷积神经网络,来将ImageNetLSVRC-2010比赛中的1.2百万个高分辨率的图形分为1000个不同的类别,在测试数据中以37.5%和17.0%的成绩达到了第一和第五的错误率。这个神经网络包含6千万个参数和650000个神经元,由5个卷积层构成,其中有一些后面连接的是最大混合层,还有三个与最终1000种softmax完全连接的层。为了使训练更快,使用了non-saturating neurons(非饱和的神经元)和一个高效的卷积操作的GPU实现。为了防止全连接层的过拟合,应用了叫做“dropout”的正则化方法,这个方法在这里也被证实是有效的。在ILSVRC-2012比赛中也输入了这个模型的变种,并以15.3%的成绩达到了前五的测试误差率,相比与第二名获得的26.2%。

        最终的神经网络包括五个卷积的和三个完全连接的层,这个深度是很重要的:发现移除任何一个卷积层(每个层包含的模型参数不超过总的1%)都会导致非常差的表现。

2. 背景介绍

        当前目标分类问题使用的是机器学习方法,为了提高它们的性能,我们可以训练更多的数据集,学习更有效地模型,并使用更好的技术防止过拟合。直到现在相对于成千上万的图像来说,有标签的图像的数据集相对很小。但是真实数据集中的实体种类繁多,想要训练识别它们就需要更大的训练集合。并且,小图像数据集的很多缺点已经被发现了,然而直到现在收集百万个具有标签的图像才成为可能。

        为了从百万个图像中学习千万个实体,就需要一个有很大的学习能力的模型,然而,实物识别任务的巨大复杂性意味着这个问题即使使用像ImageNet这么大的数据集也很难搞定,因此本文的模型也需要很多的先验知识来弥补我们没有的数据。卷积神经网络(CNNs)就构成了这样的一类模型,它的能力可以通过改变它们的深度和广度来控制,并且它们也可以对图形的本质(即统计学的平稳性和像素相关性的位置)做出有力并且基本正确的假设。相比于带有同样大小层数的标准前向神经网络,CNNs因为带有更少的连接和参数所以可以很好训练,然而在理论上他们最好的性能只是稍微差了一点点。

3. 算法简介

(一)整体架构

(1)ReLU非线性

         建立神经元输出f的标准方式是

和 

       在随机梯度的训练时间方面,这些饱和的非线性要比非饱和的非线性 慢。就和Nair和Hinton的文章中提到的一样,将这种非线性的神经元叫做RectifiedLinear Units (ReLUs)。使用ReLUs的深度卷积神经网络比使用tanh单元的处理速度要快几倍。

(2)在多个GPUs上进行训练

       本文将网络分散在两个GPUs上,我们应用的平行化架构是将一半的核或者说神经元放在每个GPU上:GPUs的交流只在特定的层上。

(3)局部响应的正则化

      ReLUs具有描述的特性,因此它们不需要要求输入正则化来防止饱和。

(4)重叠池

        在CNNs中,池层总结了在同一个核映射下相邻神经元组的输出。传统地,由邻近池单元总结的邻居是不重叠的。更精确地,一个池层可以被认为是由一个网格池单元构成的,每个是对在池单元中心中大小为z ×z的邻居的总结。

(二)防止过拟合

(1)数据量增大

      在图像数据中减少过拟合的最简单最常用的方法是利用保留的标签转换人为地增大数据集,本文使用了两种不同的数据量增大的方式。

      第一种是由产生图像转换和水平的映射构成的。从256 ×256的图像中随机提取224 ×224像素(和他们的水平映射)并在这些提取的像素上训练的网络。

      第二种方式是在训练图像上改变RGB通道的强度。特别地,在全部的ImageNet训练集上对RGB像素值实施了PCA算法。在每个训练图像上,增加了发现的主元的倍数,量值是和相应的特征值与一个从高斯分布中产生的随机数的乘积成比例的。这种框架近似抓取了原始图像的重要特性,即当改变照明的强度和颜色时目标的识别是不变的。

(2)Dropout

        结合很多不同模型的预测结果是减少测试误差的有效方法,但是这对于大的神经网络来说看起来是非常费事的,因为它本身就需要很多天来进行训练。最近提出的Dropout算法是以0.5的概率将每个隐含层的输出置0。以这种方式被丢弃的神经元在前向传播中没有贡献,也不参与到后向传播中。所以每给一个输入,神经网络就会得到一个不同的架构,但所有的这些架构都分享权重。这种方法可以减小神经元复杂的交互适应性,因为神经元不能依靠其他特定神经元的存在。因此,它可以学习到更多的鲁棒特征,这在与其他神经元的不同随机子集的结合中是有用的。在测试时间里,使用所有的神经元但是将它们的输出均乘以0.5。
0 0