Datasets:
LabelMe: consists of hundreds of thousands of fully-segmented images
ImageNet: consists of over 15 million labeled high-resolution images in over 22000 categories
这篇论文使用的数据集是ImageNet
多余的话:
ImageNet包含超过1500 0000张的已标记的高清晰度图片,这些图片大约有22000类。这些图片是从网上收集来的,人们使用亚马逊的Mechanical Turk众包工具进行标记。
ImageNet Large-Scale Visual Recognition Challenge(ILSVRC)从2010年开始,每年举行一次,是Pascal Visual Object Challenge的一部分。ILSVRC使用的只是ImageNet的一部分,1000类,每一类大约1000张,总共有120 0000张训练图片,50000张验证图片,150000张测试图片,这些图片的清晰度是不统一的。其中ILSVRC-2010是唯一一次能够获取测试集标签的。比赛通常报告两种错误,top-1 和 top-5。top-1错误率的意思是说被错误分类的图片的概率,top-5错误率的意思是说模型预测的最可能的5个标签都不是测试图片的正确标签的比例。
步入正题:
1.网络结构:
这篇论文主要做的是图片分类,对于我们人来说,拿到一张图片,我们可以很快地知道这张图片上有什么,比如一只猫,一把椅子。但是对于计算机来说,如何对图片进行分类,这就是一个问题,计算机知道的就是一串0和1这些数字。为了达到这个目的,并且效果还不错,它用的模型结构简称AlexNet
总体说来:
AlexNet共有8层,有60M以上的参数量。
前五层为卷积层:convolutional layer
后三层为全连接层:fully connected layer
最后一层是1000-way softmax,目标函数是multinorminal logistic regression.
这个是从论文中截下来的原图,这个模型是在两块3GB的GPU上训练的(GTX 580 3GB GPU),是受那个3GB内存的限制,导致能在一块GTX 580 GPU上训练的模型就有限制,所以模型结构图有上下两部分。从图上我们可以看到第2层,第4层和第5层卷积层的kernels只是和在同一GPU上的前一层kernels相连,而第3层卷积层以及全连接层的kernels则是和之前所有的kernels相连。
分层结构:
- 第1层
(1)输入图片为224 x 224 x 3,表示长宽是224个像素,使用RGB彩色图通道(通道数是3)来表示,所以还要乘以3(学界普遍认为论文中说的224不太合适,讲道理应该是227才对)
(2)使用了96个大小为11 x 11 x 3的filter。在stride为4的设置下,对输入图像进行了卷积操作,得到了 55 x 55 x 96的data map。这三个数字的由来:(227 - 96 )/ 4 + 1 = 55,96就是滤波器的个数。
(3)经过激活函数ReLu,再进行池化操作-maxpooling,滤波器(filter)大小为3 x 3,步长(stride)为2,池化后的输出为27 x 27 x 96。(55 - 3 )/ 2 + 1 = 27. 96 仍为原来的深度。
(4)
- LRN(Local Response Normalization,局部响应归一化)
- 其他4层卷积层过程与之类似
- 第6层
本层的输入为6 x 6 x 256(9216),,全连接层其实就是一个矩阵运算,它完成一个空间上的映射。所以把输入看成一个列向量X(维度为9216),也就是你可以把输入看成一个9216 x 1 的矩阵。然后和参数矩阵W相乘,这里参数矩阵W设置为4096 x 9216,最后全连接层的输出就是 W与X相乘所得,记为Y(维度为4096 x 1)。
- 第8层
第8层的输出就是1000 x 1的矩阵,即维度为1000的一个列向量,对应softmax regression的1000个标签。
2.网络结构的创新点
- ReLu(RectifiedLinear Uints,修正线性单元)
f(x)=max(0,x),是一种非饱和非线性激活函数。相较于f(x)=tanh(x)和sigmoid函数:f(x)=(1+e^-x)^-1,这两种饱和非线性激活函数而言,SGD梯度下降的时间更快。
多余的话:
- 多GPU训练
使用并行机制,将kernels分半放在2块GPU上。这里使用了一个小技巧,GPU之间的通讯只在某些层中进行。例如,第3层的核需要从第2层中所有核映射输入。然而,第4层的核只需要从第3层中位于同一GPU的那些核映射输入。
- LRN(Local Response Normalization,局部响应归一化)
本质上,这个层也是为了防止激活函数的饱和的。
根据这篇博客上( http://blog.csdn.net/cyh_24/article/details/51440344 )作者的理解:通过正则化让激活函数的输入靠近“碗”的中间(避免饱和),从而获得比较大的导数值。从功能上说,跟ReLU是重复的。
作者在论文中提到这么做可以提高网络的泛化能力。
LRN具体说来就是通过这个函数把第i个kernel位于(x,y)处的激励值进行归一化,N是那一层kernels的总数,超参数
是常量。
- 重叠池化
一个池化层可以看做是由间隔s个像素的池化单元网格组成,每个网格对一个以池化单元为中心的z x z大小的邻域进行总结。
如果s = z,就是传统的局部池化;如果s < z,就是重叠池化。
这篇论文在整个网络中,都设置s = 2 ,z = 3。同非重叠池化机制(s = 2, z = 2)相比,这个机制分别使得top-1 和 top-5 错误率减少了 0.4% 和 0.3%。
非重叠池化与重叠池化的输出都是相同的维度。而且使用重叠池化的模型在训练中更不容易过拟合。
3.避免过拟合
- data augmentation(数据扩充)
有一种观点认为神经网络是通过大量的数据训练出来的,如果增加训练数据,就能够提升算法的准确率,因为这样可以避免过拟合,而避免了过拟合就可以增大网络结构。当数据有限时,就可以通过一些变化从已有数据中生成一些新的数据,来扩大训练数据的size。
其中,最简单通用的图像数据变形的方式如下:
1.从原始图像(256,256)中随机crop出一些图像(224,224)【平移变换,crop】
2.水平翻转图像【反射变换,flip】
3.给图像增加一些随机的光照【光照、色彩变换,color jittering】
AlexNet对data augmentation的处理:
1.平移变换和反射变换:训练时,对于256 x 256的图片随机crop到224 x 224,然后允许水平翻转,相当于将样本倍增到((256 - 224)** 2)* 2 )= 2048。测试时,对左上、右上、左下、右下、中间做了5次crop,然后翻转(flip),共10个crop,之后对结果求平均。
2.改变训练图像RGB通道的强度:我们在遍及整个ImageNet训练集的RGB像素值集合中执行PCA。对于每个训练图像,我们成倍增加已有主成分,比例大小为对应特征值乘以一个从均值为0,标准差为0.1的高斯分布中提取的随机变量。这样一来,对于每个RGB图像像素,我们增加下面这项:
其中
与
分别是RGB像素值的3×3协方差矩阵的第i个特征向量与特征值,
是前面提到的随机变量。每个对于特定训练图像的全部像素只提取一次,直到那个图像再次被用于训练,在那时它被重新提取。这个方案大致抓住了自然图像的一个重要属性,即,光照强度与颜色是变化的,而对象识别是不变的。
- dropout
它做的就是以0.5的概率将每个隐层神经元的输出设置为零。以这种方式”dropped out”的神经元既不参与前向传播,也不参与反向传播。所以每次提出一个输入,该神经网络就尝试一个不同的结构,但是所有这些结构之间共享权重。因为神经元不能依赖于其他特定神经元而存在,所以这种技术降低了神经元复杂的互适应关系。正因如此,要被迫学习更为鲁棒的特征,这些特征在结合其他神经元的一些不同随机子集时有用。前两个全连接层使用dropout。如果没有dropout,我们的网络会表现出大量的过拟合。dropout使收敛所需的迭代次数大致增加了一倍。
4.图片预处理
①大小归一化
将所有图片都归一化为256x256大小,至于为什么直接不归一化到224(227),请参考上文说的扩充数据集的操作。
②减去像素平均值
所有图片的每个像素值都减去所有训练集图片的平均值。
参考博客:
1.http://blog.csdn.net/teeyohuang/article/details/75069166
2.http://blog.csdn.net/cyh_24/article/details/51440344