本文主要介绍:Caffe中一个最基本的深度学习模型AlexNet模型,原论文为:ImageNet Classification with Deep Convolutional Neural Networks。
转载请注明出处:http://blog.csdn.net/hong__fang/article/details/52080280
早在1989年,Yann LeCun (现纽约大学教授) 和他的同事们就发表了卷积神经网络(Convolution NeuralNetworks, 简称CNN)的工作。在很长时间里,CNN虽然在小规模的问题上,如手写数字,取得过当时世界最好结果,但一直没有取得巨大成功。这主要原因是,CNN在大规模图像上效果不好,比如像素很多的自然图片内容理解,所以没有得到计算机视觉领域的足够重视。
这个惊人的结果为什么在之前没有发生? 原因当然包括算法的提升,比如dropout等防止过拟合技术,但最重要的是,GPU带来的计算能力提升和更多的训练数据。
(1)为什么F6神经元是84维 ?
原文是用于手写字识别,手写字范围为0-9共有10个字符,因此输出OUTPUT层的节点共10个,可以把每个字符格式化为12*7的图像,如上图,共有84个像元,像元的参数成分(即像素值)可以设为1和-1,此时C5到F6是通过sigmod函数计算的,因此F6节点的值范围为-1到1,因此可以根据F6节点的值和格式化图像
(参数向量)的值距离,来判断输入图像的类别,即通过径向基函数:
输入离参数向量越远,RBF输出的越大。
所有训练参数和连接个数:
本深度学习网络是Alex和Hinton参加ILSVRC2012比赛的卷积网络论文,本网络结构也是开启ImageNet数据集更大,更深CNN的开山之作,本文对CNN的一些改进成为以后CNN网络通用的结构;在一些报告中被称为Alex-net,之后在Imagenet上取得更好结果的ZF-net,SPP-net,VGG等网络,都是在其基础上修改得到。
原论文:ImageNet Classification with Deep Convolutional Neural Networks
模拟神经元输出的标准函数一般是:tanh(x)或者sigmoid(x)函数,由于此类函数在x非常大或者非常小时,函数输出基本不变,所以此类函数成为饱和函数;f(x)=max(0,x),扭曲线性函数,是一种非线性的非饱和函数。在训练时间上,非饱和函数比饱和函数训练更快。而且这种扭曲线性函数,不但保留了非线性的表达能力,而且由于其具有线性性质(正值部分),相比tanh和sigmoid函数在误差反向传递时,不会有由于非线性引起的梯度弥散形象(顶层误差较大,由于逐层递减误差传递,引起低层误差很小,导致深度网络地层权值更新量很小,导致深度网络局部最优)。ReLU的这些性质可以让我们训练更深的网络。
ReLu相关知识:http://www.mamicode.com/info-detail-873243.html
单个GTX 580 GPU只有3GB内存,这限制了可以在其上训练的网络的最大规模。事实证明,120万个训练样本才足以训练网络,这网络太大了,不适合在一个GPU上训练。因此我们将网络分布在两个GPU上。目前的GPU特别适合跨GPU并行化,因为它们能够直接从另一个GPU的内存中读出和写入,不需要通过主机内存。我们采用的并行方案基本上是在每个GPU中放置一半核(或神经元),还有一个额外的技巧:GPU间的通讯只在某些层进行。这就是说,例如,第3层的核需要从第2层中所有核映射输入。然而,第4层的核只需要从第3层中位于同一GPU的那些核映射输入。选择连接模式是一个交叉验证的问题,但是这让我们可以精确地调整通信量,直到它的计算量在可接受的部分。
ReLU具有所希望的特性,它们不需要输入归一化来防止它们达到饱和。如果至少有一些训练样例对ReLU产生了正输入,学习就将发生在那个神经元。可是,我们仍然发现下列局部归一化方案有助于一般化。用表示点
处通过应用核 计算出的神经元激活度,然后应用ReLU非线性,响应归一化活性
由下式给出
其中求和覆盖了n个“相邻的”位于相同空间位置的核映射,N是该层中的核总数。核映射的顺序当然是任意的,且在训练开始前就确定。受到在真实神经元中发现的类型启发,这种响应归一化实现了一种侧向抑制,在使用不同核计算神经元输出的过程中创造对大激活度的竞争。常数k,n,α和β是超参数,它们的值要用验证集来确定;我们使用。我们在某些层应用ReLU归一化后再应用这种归一化(见3.5节)。
该方案与Jarrett等人的局部对比度归一化方案具有一些相似之处[11],但我们的方案更正确的命名为“亮度归一化”,因为我们不减去平均活跃度。响应归一化将我们的top-1与top-5误差率分别减少了1.4%与1.2%。我们也验证了该方案在CIFAR-10数据集上的有效性:四层CNN不带归一化时的测试误差率是13%,带归一化时是11%。
CNN中的Pooling层总结了同一核映射中邻近神经元组的输出。传统上,通过邻接pooling单元总结的邻近关系不重叠(例如,[17,11,4])。更准确地说,一个pooling层可以被认为是由间隔s像素的pooling单元网格组成,每个网格总结出一个z×z大小的邻近关系,都位于pooling单元的中心位置。若设s=z,我们得到传统的局部pooling,正如常用于CNN中的那样。若设s
我们的神经网络结构有6000万个参数。虽然ILSVRC的1000个类别,使得每个训练样本在图像到标签的映射上强加了10比特约束,事实上学习如此多的参数而不带相当大的过拟合,这些类别是不够的。下面,我们描述减少过拟合的两种主要方法。
<1>数据扩充
对于图像数据来说,减少过拟合问题,最早使用的同时也是最常用的方法就是,在保持数据标签不变的情况下增大数据集。这里我们使用了两种不同的方法,它们都只需要很少的计算量,因此变换后的图像并不需要存储在硬盘中,而只需要存放在内存中即可。在我们的实现中,转换图像是由CPU上的Python代码生成的,与此同时,在GPU上训练先前产生的图像,因此这些数据扩展方案是计算自由的。
(1)图像平移和翻转
我们从256×256的图像中提取随机的224×224的碎片(还有它们的水平反射),并在这些提取的碎片上训练我们的网络(这就是图2中输入图像是224×224×3维的原因)。这使得我们的训练集规模扩大了2048倍(32*32*2=2048),但是由此产生的训练样例一定高度地相互依赖。如果没有这个方案,我们的网络会有大量的过拟合,这将迫使我们使用小得多的网络。在测试时,该网络通过提取五个224×224的碎片(四个边角碎片和中心碎片)连同它们的水平反射(因此总共是十个碎片)做出了预测,并在这十个碎片上来平均该网络的softmax层做出的预测。
(2)调整RGB像素值
具体来说,我们在遍及整个ImageNet训练集的RGB像素值集合中执行PCA。对于每个训练图像,我们成倍增加已有主成分,比例大小为对应特征值乘以一个从均值为0,标准差为0.1的高斯分布中提取的随机变量。这样一来,对于每个RGB图像像素,我们增加下面这项:
其中与
分别是RGB像素值的3×3协方差矩阵的第i个特征向量与特征值,是
前面提到的随机变量。每个
对于特定训练图像的全部像素只提取一次,直到那个图像再次被用于训练,在那时它被重新提取。这个方案大致抓住了自然图像的一个重要属性,即,光照强度与颜色是变化的,而对象识别是不变的。该方案将top-1误差率减少了1%以上。
<2>Dropout
结合许多不同模型的预测是一种非常成功的减少测试误差的方式[1,3],但它先前训练花了好几天时间,似乎对于大型神经网络来说太过昂贵。然而,有一个非常有效的模型组合版本,它在训练中只花费两倍于单模型的时间。最近推出的叫做“dropout”的技术[10],它做的就是以0.5的概率将每个隐层神经元的输出设置为零。以这种方式“dropped out”的神经元既不参与前向传播,也不参与反向传播。所以每次提出一个输入,该神经网络就尝试一个不同的结构,但是所有这些结构之间共享权重。因为神经元不能依赖于其他特定神经元而存在,所以这种技术降低了神经元复杂的互适应关系。正因如此,要被迫学习更为鲁棒的特征,这些特征在结合其他神经元的一些不同随机子集时有用。在测试时,我们将所有神经元的输出都仅仅只乘以0.5,对于获取指数级dropout网络产生的预测分布的几何平均值,这是一个合理的近似方法。
前两个全连接层使用dropout。如果没有dropout,我们的网络会表现出大量的过拟合。dropout使收敛所需的迭代次数大致增加了一倍。
理解:每次选择一半的节点进行连接构成网络,只在被选中参与连接的节点上进行正向和反向传播,如下图,左侧是全连接形式,右边是一半节点构成的网络:
为什么有助于防止过拟合呢?可以简单地这样解释,运用了dropout的训练过程,相当于训练了很多个只有半数隐层单元的神经网络(后面简称为“半数网络”),每一个这样的半数网络,都可以给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都可以给出正确的分类结果,那么少数的错误分类结果就不会对最终结果造成大的影响。
Dropout相关知识:http://www.mamicode.com/info-detail-517504.html
该网络包括八个带权层;前五层是卷积层,剩下三层是全连接层。最后一个全连接层的输出被送到一个1000-way的softmax层,其产生一个覆盖1000类标签的分布。我们的网络使得多分类的Logistic回归目标最大化,这相当于最大化了预测分布下训练样本中正确标签的对数概率平均值。
第二、第四和第五个卷积层的核只连接到前一个卷积层也位于同一GPU中的那些核映射上(见图2)。第三个卷积层的核被连接到第二个卷积层中的所有核映射上。全连接层中的神经元被连接到前一层中所有的神经元上。响应归一化层跟在第一、第二个卷积层后面。最大Pooling层,跟在响应归一化层以及第五个卷积层之后。ReLU非线性应用于每个卷积层及全连接层的输出。
第一个卷积层利用96个大小为11×11×3、步长为4个像素(这是同一核映射中邻近神经元的感受野中心之间的距离)的核,来对大小为224×224×3的输入图像进行滤波。第二个卷积层需要将第一个卷积层的(响应归一化及池化的)输出作为自己的输入,且利用256个大小为5×5×48的核对其进行滤波(注:48对应第一层得到的48个map,即第一层的所有map卷积生成第二层的一个map图)。第三、第四和第五个卷积层彼此相连,没有任何介于中间的pooling层与归一化层。第三个卷积层有384个大小为3×3×256的核被连接到第二个卷积层的(归一化的、池化的)输出。第四个卷积层拥有384个大小为3×3×192的核,第五个卷积层拥有256个大小为3×3×192的核。全连接层都各有4096个神经元。
我们使用随机梯度下降法和一批大小为128、动力为0.9、权重衰减为0.0005的样例来训练我们的网络。我们发现,这少量的权重衰减对于模型学习是重要的。换句话说,这里的权重衰减不仅仅是一个正则化矩阵:它减少了模型的训练误差。对于权重w的更新规则为
其中i是迭代指数,v是动力变量,ε是学习率,是目标关于w、对
求值的导数在第i批样例 上的平均值。
我们用一个均值为0、标准差为0.01的高斯分布初始化了每一层的权重。我们用常数1初始化了第二、第四和第五个卷积层以及全连接隐层的神经元偏差。该初始化通过提供带正输入的ReLU来加速学习的初级阶段。我们在其余层用常数0初始化神经元偏差。
对于所有层都使用了相等的学习率,这是在整个训练过程中手动调整的。我们遵循的启发式是,当验证误差率在当前学习率下不再提高时,就将学习率除以10。学习率初始化为0.01,在终止前降低三次。作者训练该网络时大致将这120万张图像的训练集循环了90次,在两个NVIDIA GTX 580 3GB GPU上花了五到六天。
随机梯度下降法:http://blog.csdn.net/lilyth_lilyth/article/details/8973972
参考网址:
[1] 译ImageNet Classification with Deep Convolutional Neural Networks
http://blog.csdn.net/u011534057/article/details/51318670
[2] [caffe]深度学习之图像分类模型AlexNet解读
http://blog.csdn.net/sunbaigui/article/details/39938097
[3] Deep Learning 读书笔记(五):ImageNet Classification with Deep Convolutional Neural Net http://www.ithao123.cn/content-8249001.html
[4] 深度学习研究理解4:ImageNet Classification with Deep Convolutional Neural Network http://www.ithao123.cn/content-8086567.html