深度学习小白笔记:AlexNet篇

前言:作为一个刚刚学习深度学习的小白和一个第一次在CSDN上写博客的新用户,在这里分享一下初步学习了AlexNet之后对这个网络的理解,如果大家看到错误,希望加以指正。

一言不合先摆上一张AlexNet中最最重要的核心构架图:
深度学习小白笔记:AlexNet篇_第1张图片
好了,看了这张结构图,我们就可以慢慢的品味他的结构和特色啦!

AlexNet的主要参数:

  • 结构:8层
  • 卷积层:5层
  • 全连接层:3层
  • 神经元数目:65万
  • 参数个数:6000万
  • 输入的图片尺寸:224x224x3
  • 卷积核:
    conv1:11x11x3,步长为4,卷积核个数为96
    conv2:5x5x48,步长为1,卷积核个数为256
    conv3:3x3x256,步长为1,卷积核个数为384
    conv4:3x3x192,步长为1,卷积核个数为384
    conv5:3x3x192,步长为1,卷积核个数为256

AlexNet网络构架

深度学习小白笔记:AlexNet篇_第2张图片
通过上面的图可以很清晰的看出AlexNet的结构(顺便再看看一开始附上的权威结构图):
第一、第二卷积层后面是重叠的最大池化层,第三个、第四个和第五个卷积层都是直接相连的。第5个卷积层后面还有一个重叠的最大池层,它的输出会进入两个全连接层。第二个全连接层可以给softmax分类器提供1000类标签。
(这里简单讲讲重叠池带来的好处:使用重叠池的方案,将原有的前一和前五的错误率分别降低了0.4%和0.3%,产生了等效维度的输出。并且通过训练得知,应用了重叠池的模型更不容易过度拟合,当然减少过度拟合AlexNet还运用了别的方式,在后文会具体讲到)
在所有的卷积层和全连接层之后,都应用了ReLU非线性函数输出。第一和第二个卷积层都应用ReLU非线性函数,然后进行局部标准化,最后执行pooling操作方法。

处理过程:
第一层:
1.输入Input的图像规格: 224x224x3(三通道RGB图像),后期调整为227x227x3
2.使用的48x2=96个大小规格为11x11x3的卷积核,进行特征提取:(227-11)/4+1=55个像素,输出数据为个55x55x96的像素层数据,分为2组55x55x48(采用了2个GPU服务器处理,每一个服务器上承担了48个)
3.重叠层:池化运算的尺度由预先设定为3x3,运算的步长为2,则池化后的图像的尺寸为:(55-3)/2+1=27。即经过池化处理过的规模为27x27x96,分为2组27x27x48
4. LRN局部响应归一化:使用ReLU激励函数,来确保特征图的值范围在合理范围之内,归一化运算的尺度为5x5;第一层卷积层结束后形成的图像层的规模为27x27x96,分为2组27x27x48
第二层:
1.输入:输入数据为第一层输出的27x27x96的像素层,分为2组像素数据
2.每组像素数据被5x5x48的卷积核进行卷积运算,同理按照第一层的方式进行:(27-5+2x2)/1+1=27个像素,一共有256个卷积核,这样也就有了27x27x256像素层,分为2组27x27x128
3.重叠层:同样经过池化运算,池化后的图像尺寸为 (27-3)/2+1=13,即池化后像素的规模为13x13x256,即2组13x13x128的像素层。
4. LRN局部响应归一化:使用ReLU激励函数,最后经过归一化处理,分别对应2组128个卷积核所运算形成。
第三层:
1.输入:数据为第二层输出的13x13x256的像素层,分为2组像素数据13x13x128
2.每组像素数据被3x3x128的卷积核(两组,一共也就有3x3x256)进行卷积运算,同理按照第一层的方式进行:(13-3+1*2)/1+1=13个像素,一共有384个卷积核,这样也就有了13x13x384,即2组13x13x192的像素层。
第四层:
1.输入:数据为第三层输出的13x13x384的像素层,分为2组像素数据13x13x192
2.每组像素数据被3x3x192的卷积核(两组,一共也就有3x3x384)进行卷积运算,同理按照第一层的方式进行:(13-3+1x2)/1+1=13个像素,一共有384个卷积核,这样也就有了13x13x384,即2组13x13x192像素层。
第五层:
1.输入:输入数据为第四层输出的13x13x384的像素层,分为2组像素数据13x13x192
2.每组像素数据被3x3x192的卷积核(两组,一共也就有3x3x384)进行卷积运算,同理按照第一层的方式进行:(13-3+1x2)/1+1=13个像素,一共有256个卷积核,这样也就有了13x13x256,即2组13x13x128两组像素层。
3.重叠层:进过池化运算,池化后像素的尺寸为==(13-3)/2+1=6==,即池化后像素的规模变成了6x6x256规模的像素层,两组6x6x128的像素层。
第六层:
1.输入:输入数据的尺寸是6x6x256的像素层,即两组6x6x128的像素层。
2.采用6x6x256尺寸的卷积核(共4096个)对第六层的输入数据进行卷积运算。
3.通过ReLU激活函数以及dropout运算输出4096个本层的输出结果值。
(滤波器的尺寸和待处理的feature map的尺寸相同,滤波器中的每个系数只与feature map中的一个像素值相乘;而采用的滤波器的尺寸和待处理的feature map的尺寸不相同,每个滤波器的系数都会与多个feature map中像素相乘。)
第七层:
第6层输出的4096个数据与第7层的4096个神经元进行全连接,然后经由ReLU和Dropout进行处理后生成4096个数据。
第八层:
第7层输入的4096个数据与第8层的1000个神经元进行全连接,经过训练后输出被训练的数值。

在了解了大致的网络构架和处理过程后,我们来看看AlexNet的重点特色吧!!

ReLU

AlexNet的一个重要特性就是R使用了ReLU(整流线性单元)的非线性。Tanh或sigmoid激活函数曾是训练神经网络模型的常用方法,但是这些饱和非线性要比非饱和非线性f(x) = max(0,x)慢得多。使用ReLUs的深层卷积神经网络的训练速度是使用tanh单元的等效神经网络的几倍。
深度学习小白笔记:AlexNet篇_第3张图片
四层卷积神经网络(solidline)与四层卷积神经网络(relus)相比,能以快6倍的速度达到25%的训练错误率。

双GPU并行运行

在上文介绍AlexNet网络构架的时候,有一个很重要的部分大家会注意到,那就是对数据的处理时,为了解决一个GPU运行困难的问题,采取双GPU并行运行的方式。使用的并行化方案实际上是将一半的内核(或神经元)放在每个GPU上。简单的理解就是每个GPU只承担一半的计算量。特别需要注意的是:GPU只在特定的层中通信。

LRN局部响应归一化

事实上,通过上面的对ReLU的描述,ReLU不需要输入标准化来防止饱和,但是,原文仍然表明局部标准化能提高性能
在这里插入图片描述

常数k, n、α和βhyper-parameters的值是是实验得到的,原文使用k = 2, n = 5,α= 10−4,β= 0.75。
响应标准化分别将我们的前1和前5的错误率降低1.4%和1.2%。四层CNN在未归一化的情况下测试错误率为13%,在归一化的情况下测试错误率为11%。

减少过度拟合

除了之前提到的重叠池防止过拟合,事实上,AlexNet本身也采取了很好的减少过度拟合的方案

  • 数据增益
    数据增强的第一种形式包括生成图像平移和水平反射:我们从256x256幅图像中随机抽取224x224块(以及它们的水平反射),然后在这些提取出来的图像上训练我们的网络。这使得我们的训练集增加了2048倍
    第二种形式是改变训练图像中RGB通道的强度:对RGB像素值集执行PCA。对于每一个训练图像,我们添加找到的主成分的倍数,大小与相应的特征值成比例,乘以一个随机变量从一个高斯分布,均值为零,标准差为0.1。
    在这里插入图片描述
    方案近似地捕获了自然图像的一个重要特性,即目标度不随光照强度和颜色的变化而变化。该方案将前1个错误率降低了1%以上。
  • Dropout
    Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能。
    Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过随机忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象,以这种方式脱落的神经元不参与正向传递,也不参与反向传播。深度学习小白笔记:AlexNet篇_第4张图片

总结一下AlexNet中几个重要的操作和好处

  1. 成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。
  2. 训练时全连接层使用Dropout随机忽略一部分神经元,以避免模型过拟合。
  3. 提出LRN层(即局部响应归一化),对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强模型的泛化能力。
  4. 使用重叠池化层(步长小于卷积核),避免了平均池化的模糊效果,同时提升特征的丰富性。
  5. 双GPU运行,减轻每个GPU的运行负担,提高了训练的速度和效率。

再补充几个初步学习产生困惑的地方:
全连接层:
CNN中的全连接层负责逻辑推断,所有的参数都需要学习得到。第一层的全连接层(AlexNet结构为R1)还用于链接卷积层的输出,它还有一个作用是去除空间信息(通道数),将三维矩阵变成向量。
深度学习小白笔记:AlexNet篇_第5张图片
卷积过程:
附张一张生动形象的图
深度学习小白笔记:AlexNet篇_第6张图片
池化层:
池化操作作用于用于卷积操作之后,其作用在于特征融合和降维,其实也是一种类似卷积的操作,只是池化层的所有参数都是超参数,都是不用学习得到的。
同样附上一张好理解的图
深度学习小白笔记:AlexNet篇_第7张图片

小白的初步学习,到这里告一段落
持续更新中。。。。。。

你可能感兴趣的:(深度学习小白笔记:AlexNet篇)