0


sheng的学习笔记-AI-卷积神经网络经典架构-LeNet-5、AlexNet、VGGNet-16

目录:目录

看本文章之前,需要学习卷积神经网络基础,可参考 sheng的学习笔记-卷积神经网络-CSDN博客

卷积神经网络常用的架构:一个或多个卷积层后面跟着一个池化层,然后又是若干个卷积层再接一个池化层,然后是全连接层,最后是输出,这种排列方式很常用。

LeNet-5

LeNet-5是一个经典的深度卷积神经网络,由Yann LeCun在1998年提出,旨在解决手写数字识别问题,被认为是卷积神经网络的开创性工作之一。该网络是第一个被广泛应用于数字图像识别的神经网络之一,也是深度学习领域的里程碑之一。

架构图

LeNet-5的基本结构包括7层网络结构(不含输入层),其中包括2个卷积层、2个降采样层(池化层)、2个全连接层和输出层。

  • 从左往右看,随着网络越来越深,图像的高度和宽度在缩小,从最初的32×32缩小到28×28,再到14×14、10×10,最后只有5×5。与此同时,随着网络层次的加深,通道数量一直在增加,从1增加到6个,再到16个。这种架构,可以支持的入参 数量,没有那么多,对于高清图像的处理没那么好
  • LeNet-5的论文是在1998年撰写的,当时人们并不使用padding,或者总是使用valid卷积(不填充,padding为0),这就是为什么每进行一次卷积,图像的高度和宽度都会缩小

层级解析

1、输入层(Input layer)

输入层接收大小为 32×32 的手写数字图像,其中包括灰度值(0-255)。在实际应用中,我们通常会对输入图像进行预处理,例如对像素值进行归一化,以加快训练速度和提高模型的准确性。

2、卷积层C1(Convolutional layer C1)

卷积层C1包括6个卷积核,每个卷积核的大小为 5×5 ,步长为1,填充为0。因此,每个卷积核会产生一个大小为 28×28 的特征图(输出通道数为6)。

3、采样/池化层S2(Subsampling layer S2)

采样层S2采用最大池化(max-pooling)操作,每个窗口的大小为 2×2 ,步长为2。因此,每个池化操作会从4个相邻的特征图中选择最大值,产生一个大小为 14×14 的特征图(输出通道数为6)。这样可以减少特征图的大小,提高计算效率,并且对于轻微的位置变化可以保持一定的不变性。

4、卷积层C3(Convolutional layer C3)

卷积层C3包括16个卷积核,每个卷积核的大小为 5×5 ,步长为1,填充为0。因此,每个卷积核会产生一个大小为 10×10 的特征图(输出通道数为16)。

5、采样/池化层S4(Subsampling layer S4)

采样层S4采用最大池化操作,每个窗口的大小为 2×2 ,步长为2。因此,每个池化操作会从4个相邻的特征图中选择最大值,产生一个大小为 5×5 的特征图(输出通道数为16)。

6、全连接层C5(Fully connected layer C5)

C5将每个大小为 5×5 的特征图拉成一个长度为400的向量,并通过一个带有120个神经元的全连接层进行连接。120是由LeNet-5的设计者根据实验得到的最佳值。

7、全连接层F6(Fully connected layer F6)

全连接层F6将120个神经元连接到84个神经元。

8、输出层(Output layer)

输出层由10个神经元组成,每个神经元对应0-9中的一个数字,并输出最终的分类结果。在训练过程中,使用交叉熵损失函数计算输出层的误差,并通过反向传播算法更新卷积核和全连接层的权重参数。

AlexNet

2012 年,Alex Krizhevsky、Ilya Sutskever 在多伦多大学 Geoff Hinton 的实验室设计出了一个深层的卷积神经网络 AlexNet,夺得了 2012 年 ImageNet LSVRC 的冠军,且准确率远超第二名(top5 错误率为 15.3%,第二名为 26.2%),引起了很大的轰动。AlexNet 可以说是具有历史意义的一个网络结构,在此之前,深度学习已经沉寂了很长时间,自 2012 年 AlexNet 诞生之后,后面的 ImageNet 冠军都是用卷积神经网络(CNN)来做的,并且层次越来越深,使得 CNN 成为在图像识别分类的核心算法模型,带来了深度学习的大爆发。

架构图

AlexNet首先用一张227×227×3的图片作为输入,实际上原文中使用的图像是224×224×3,但是如果你尝试去推导一下,你会发现227×227这个尺寸更好一些。

  1. 第一层我们使用96个11×11的过滤器,步幅为4,由于步幅是4,因此尺寸缩小到55×55,缩小了4倍左右。
  2. 然后用一个3×3的过滤器构建最大池化层,f=3,步幅s为2,卷积层尺寸缩小为27×27×96。
  3. 接着再执行一个5×5的卷积,padding之后,输出是27×27×276。
  4. 然后再次进行最大池化,尺寸缩小到13×13。
  5. 再执行一次same卷积,相同的padding,得到的结果是13×13×384,384个过滤器。
  6. 再做一次same卷积。
  7. 再做一次同样的操作,
  8. 最后再进行一次最大池化,尺寸缩小到6×6×256。6×6×256等于9216,将其展开为9216个单元
  9. 然后是一些全连接层。
  10. 最后使用softmax函数输出识别的结果,看它究竟是1000个可能的对象中的哪一个。

实际上,这种神经网络与LeNet有很多相似之处,不过AlexNet要大得多。LeNetLeNet-5大约有6万个参数,而AlexNet包含约6000万个参数。当用于训练图像和数据集时,AlexNet能够处理非常相似的基本构造模块,这些模块往往包含着大量的隐藏单元或数据。

AlexNet网络结构看起来相对复杂,包含大量超参数,这些数字(55×55×96、27×27×96、27×27×256……)都是Alex Krizhevsky及其合著者不得不给出的。

AlexNet 模型的特点

AlexNet 之所以能够成功,跟这个模型设计的特点有关,主要有:

  • 使用了非线性激活函数:ReLU
  • 防止过拟合的方法:Dropout,数据扩充(Data augmentation)
  • 其他:多 GPU 实现,LRN 归一化层的使用

1)使用 ReLU 激活函数

传统的神经网络普遍使用 Sigmoid 或者 tanh 等非线性函数作为激励函数,然而它们容易出现梯度弥散或梯度饱和的情况。以 Sigmoid 函数为例,当输入的值非常大或者非常小的时候,这些神经元的梯度接近于 0(梯度饱和现象),如果输入的初始值很大的话,梯度在反向传播时因为需要乘上一个 Sigmoid 导数,会造成梯度越来越小,导致网络变的很难学习。
在 AlexNet 中,使用了 ReLU (Rectified Linear Units)激励函数,该函数的公式为:f (x)=max (0,x),当输入信号 < 0 时,输出都是 0,当输入信号 > 0 时,输出等于输入,如下图所示:

使用 ReLU 替代 Sigmoid/tanh,由于 ReLU 是线性的,且导数始终为 1,计算量大大减少,收敛速度会比 Sigmoid/tanh 快很多,如下图所示:

2)数据扩充(Data augmentation)

有一种观点认为神经网络是靠数据喂出来的,如果能够增加训练数据,提供海量数据进行训练,则能够有效提升算法的准确率,因为这样可以避免过拟合,从而可以进一步增大、加深网络结构。而当训练数据有限时,可以通过一些变换从已有的训练数据集中生成一些新的数据,以快速地扩充训练数据。
其中,最简单、通用的图像数据变形的方式:水平翻转图像,从原始图像中随机裁剪、平移变换,颜色、光照变换,如下图所示:

AlexNet 在训练时,在数据扩充(data augmentation)这样处理:
(1)随机裁剪,对 256×256 的图片进行随机裁剪到 224×224,然后进行水平翻转,相当于将样本数量增加了((256-224)^2)×2=2048 倍;
(2)测试的时候,对左上、右上、左下、右下、中间分别做了 5 次裁剪,然后翻转,共 10 个裁剪,之后对结果求平均。作者说,如果不做随机裁剪,大网络基本上都过拟合;
(3)对 RGB 空间做 PCA(主成分分析),然后对主成分做一个(0, 0.1)的高斯扰动,也就是对颜色、光照作变换,结果使错误率又下降了 1%。

3)重叠池化 (Overlapping Pooling)

一般的池化(Pooling)是不重叠的,池化区域的窗口大小与步长相同,如下图所示:


在 AlexNet 中使用的池化(Pooling)却是可重叠的,也就是说,在池化的时候,每次移动的步长小于池化的窗口长度。AlexNet 池化的大小为 3×3 的正方形,每次池化移动步长为 2,这样就会出现重叠。重叠池化可以避免过拟合,这个策略贡献了 0.3% 的 Top-5 错误率。

此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果

4)局部归一化(Local Response Normalization,简称 LRN)

局部响应归一层的基本思路是,假如这是网络的一块,比如是13×13×256,LRN要做的就是选取一个位置,比如说这样一个位置,从这个位置穿过整个通道,能得到256个数字,并进行归一化。进行局部响应归一化的动机是,对于这张13×13的图像中的每个位置来说,我们可能并不需要太多的高激活神经元

5)Dropout

引入 Dropout 主要是为了防止过拟合。在神经网络中 Dropout 通过修改神经网络本身结构来实现,对于某一层的神经元,通过定义的概率将神经元置为 0,这个神经元就不参与前向和后向传播,就如同在网络中被删除了一样,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新。在下一次迭代中,又重新随机删除一些神经元(置为 0),直至训练结束。

其主要的思想是,随机减少中间层节点,减少每个节点对最终结果的影响,从而防止过拟合

6) 多 GPU 训练

AlexNet 当时使用了 GTX580 的 GPU 进行训练,由于单个 GTX 580 GPU 只有 3GB 内存,这限制了在其上训练的网络的最大规模,因此他们在每个 GPU 中放置一半核(或神经元),将网络分布在两个 GPU 上进行并行计算,大大加快了 AlexNet 的训练速度。

详细的逐层解析

下图是 AlexNet 的网络结构图:

AlexNet 网络结构共有 8 层,前面 5 层是卷积层,后面 3 层是全连接层,最后一个全连接层的输出传递给一个 1000 路的 softmax 层,对应 1000 个类标签的分布。
由于 AlexNet 采用了两个 GPU 进行训练,因此,该网络结构图由上下两部分组成,一个 GPU 运行图上方的层,另一个运行图下方的层,两个 GPU 只在特定的层通信。例如第二、四、五层卷积层的核只和同一个 GPU 上的前一层的核特征图相连,第三层卷积层和第二层所有的核特征图相连接,全连接层中的神经元和前一层中的所有神经元相连接。

下面逐层解析 AlexNet 结构:

1、第一层(卷积层)

该层的处理流程为:卷积 -->ReLU--> 池化 --> 归一化,流程图如下:

(1)卷积
输入的原始图像大小为 224×224×3(RGB 图像),在训练时会经过预处理变为 227×227×3。在本层使用 96 个 11×11×3 的卷积核进行卷积计算,生成新的像素。由于采用了两个 GPU 并行运算,因此,网络结构图中上下两部分分别承担了 48 个卷积核的运算。
卷积核沿图像按一定的步长往 x 轴方向、y 轴方向移动计算卷积,然后生成新的特征图,其大小为:floor ((img_size - filter_size)/stride) +1 = new_feture_size,其中 floor 表示向下取整,img_size 为图像大小,filter_size 为核大小,stride 为步长,new_feture_size 为卷积后的特征图大小,这个公式表示图像尺寸减去卷积核尺寸除以步长,再加上被减去的核大小像素对应生成的一个像素,结果就是卷积后特征图的大小。
AlexNet 中本层的卷积移动步长是 4 个像素,卷积核经移动计算后生成的特征图大小为 (227-11)/4+1=55,即 55×55。
(2)ReLU
卷积后的 55×55 像素层经过 ReLU 单元的处理,生成激活像素层,尺寸仍为 2 组 55×55×48 的像素层数据。
(3)池化
RuLU 后的像素层再经过池化运算,池化运算的尺寸为 3×3,步长为 2,则池化后图像的尺寸为 (55-3)/2+1=27,即池化后像素的规模为 27×27×96
(4)归一化
池化后的像素层再进行归一化处理,归一化运算的尺寸为 5×5,归一化后的像素规模不变,仍为 27×27×96,这 96 层像素层被分为两组,每组 48 个像素层,分别在一个独立的 GPU 上进行运算。

2、第二层(卷积层)

该层与第一层类似,处理流程为:卷积 -->ReLU--> 池化 --> 归一化,流程图如下:

(1)卷积
第二层的输入数据为第一层输出的 27×27×96 的像素层(被分成两组 27×27×48 的像素层放在两个不同 GPU 中进行运算),为方便后续处理,在这里每幅像素层的上下左右边缘都被填充了 2 个像素(填充 0),即图像的大小变为 (27+2+2) ×(27+2+2)。第二层的卷积核大小为 5×5,移动步长为 1 个像素,跟第一层第(1)点的计算公式一样,经卷积核计算后的像素层大小变为 (27+2+2-5)/1+1=27,即卷积后大小为 27×27。
本层使用了 256 个 5×5×48 的卷积核,同样也是被分成两组,每组为 128 个,分给两个 GPU 进行卷积运算,结果生成两组 27×27×128 个卷积后的像素层。
(2)ReLU
这些像素层经过 ReLU 单元的处理,生成激活像素层,尺寸仍为两组 27×27×128 的像素层。
(3)池化
再经过池化运算的处理,池化运算的尺寸为 3×3,步长为 2,池化后图像的尺寸为 (57-3)/2+1=13,即池化后像素的规模为 2 组 13×13×128 的像素层
(4)归一化
然后再经归一化处理,归一化运算的尺度为 5×5,归一化后的像素层的规模为 2 组 13×13×128 的像素层,分别由 2 个 GPU 进行运算。

3、第三层(卷积层)

第三层的处理流程为:卷积 -->ReLU

(1)卷积
第三层输入数据为第二层输出的 2 组 13×13×128 的像素层,为便于后续处理,每幅像素层的上下左右边缘都填充 1 个像素,填充后变为 (13+1+1)×(13+1+1)×128,分布在两个 GPU 中进行运算。
这一层中每个 GPU 都有 192 个卷积核,每个卷积核的尺寸是 3×3×256。因此,每个 GPU 中的卷积核都能对 2 组 13×13×128 的像素层的所有数据进行卷积运算。如该层的结构图所示,两个 GPU 有通过交叉的虚线连接,也就是说每个 GPU 要处理来自前一层的所有 GPU 的输入。
本层卷积的步长是 1 个像素,经过卷积运算后的尺寸为 (13+1+1-3)/1+1=13,即每个 GPU 中共 13×13×192 个卷积核,2 个 GPU 中共有 13×13×384 个卷积后的像素层。
(2)ReLU
卷积后的像素层经过 ReLU 单元的处理,生成激活像素层,尺寸仍为 2 组 13×13×192 的像素层,分配给两组 GPU 处理。

4、第四层(卷积层)

与第三层类似,第四层的处理流程为:卷积 -->ReLU

(1)卷积
第四层输入数据为第三层输出的 2 组 13×13×192 的像素层,类似于第三层,为便于后续处理,每幅像素层的上下左右边缘都填充 1 个像素,填充后的尺寸变为 (13+1+1)×(13+1+1)×192,分布在两个 GPU 中进行运算。
这一层中每个 GPU 都有 192 个卷积核,每个卷积核的尺寸是 3×3×192(与第三层不同,第四层的 GPU 之间没有虚线连接,也即 GPU 之间没有通信)。卷积的移动步长是 1 个像素,经卷积运算后的尺寸为 (13+1+1-3)/1+1=13,每个 GPU 中有 13×13×192 个卷积核,2 个 GPU 卷积后生成 13×13×384 的像素层。
(2)ReLU
卷积后的像素层经过 ReLU 单元处理,生成激活像素层,尺寸仍为 2 组 13×13×192 像素层,分配给两个 GPU 处理。

5、第五层(卷积层)

第五层的处理流程为:卷积 -->ReLU--> 池化

(1)卷积
第五层输入数据为第四层输出的 2 组 13×13×192 的像素层,为便于后续处理,每幅像素层的上下左右边缘都填充 1 个像素,填充后的尺寸变为 (13+1+1)×(13+1+1) ,2 组像素层数据被送至 2 个不同的 GPU 中进行运算。
这一层中每个 GPU 都有 128 个卷积核,每个卷积核的尺寸是 3×3×192,卷积的步长是 1 个像素,经卷积后的尺寸为 (13+1+1-3)/1+1=13,每个 GPU 中有 13×13×128 个卷积核,2 个 GPU 卷积后生成 13×13×256 的像素层。
(2)ReLU
卷积后的像素层经过 ReLU 单元处理,生成激活像素层,尺寸仍为 2 组 13×13×128 像素层,由两个 GPU 分别处理。
(3)池化
2 组 13×13×128 像素层分别在 2 个不同 GPU 中进行池化运算处理,池化运算的尺寸为 3×3,步长为 2,池化后图像的尺寸为 (13-3)/2+1=6,即池化后像素的规模为两组 6×6×128 的像素层数据,共有 6×6×256 的像素层数据。

6、第六层(全连接层)

第六层的处理流程为:卷积(全连接)-->ReLU-->Dropout

(1)卷积(全连接)
第六层输入数据是第五层的输出,尺寸为 6×6×256。本层共有 4096 个卷积核,每个卷积核的尺寸为 6×6×256,由于卷积核的尺寸刚好与待处理特征图(输入)的尺寸相同,即卷积核中的每个系数只与特征图(输入)尺寸的一个像素值相乘,一一对应,因此,该层被称为全连接层。由于卷积核与特征图的尺寸相同,卷积运算后只有一个值,因此,卷积后的像素层尺寸为 4096×1×1,即有 4096 个神经元。
(2)ReLU
这 4096 个运算结果通过 ReLU 激活函数生成 4096 个值。
(3)Dropout
然后再通过 Dropout 运算,输出 4096 个结果值。

7、第七层(全连接层)

第七层的处理流程为:全连接 -->ReLU-->Dropout

第六层输出的 4096 个数据与第七层的 4096 个神经元进行全连接,然后经 ReLU 进行处理后生成 4096 个数据,再经过 Dropout 处理后输出 4096 个数据。

8、第八层(全连接层)

第八层的处理流程为:全连接

第七层输出的 4096 个数据与第八层的 1000 个神经元进行全连接,经过训练后输出 1000 个 float 型的值,这就是预测结果。

总结图

VGG-16

VGGNet 是由牛津大学视觉几何小组(Visual Geometry Group, VGG)提出的一种深层卷积网络结构,他们以 7.32% 的错误率赢得了 2014 年 ILSVRC 分类任务的亚军(冠军由 GoogLeNet 以 6.65% 的错误率夺得)和 25.32% 的错误率夺得定位任务(Localization)的第一名(GoogLeNet 错误率为 26.44%)。VGG可以看成是加深版本的AlexNet. 都是conv layer + FC layer。

论文地址:https://arxiv.org/pdf/1409.1556.pdf

VGG-16的这个数字16,就是指在这个网络中包含16个卷积层和全连接层(**conv+fc的总层数是16,是不包括max pool的层数)**。

总共包含约1.38亿个参数,但VGG-16的结构并不复杂,而且这种网络结构很规整,整个网络都使用卷积核尺寸为 3×3 和最大池化尺寸 2×2,都是几个卷积层后面跟着可以压缩图像大小的池化层,池化层缩小图像的高度和宽度。同时,卷积层的过滤器数量变化存在一定的规律,由64翻倍变成128,再到256和512。每一步都进行翻倍,或者说在每一组卷积层进行过滤器翻倍操作,正是设计此种网络结构的另一个简单原则。这种相对一致的网络结构对研究者很有吸引力,而它的主要缺点是需要训练的特征数量非常巨大。

架构图

VGG-16网络没有那么多超参数,这是一种只需要专注于构建卷积层的简单网络。

  • 假设这个小图是我们的输入图像,尺寸是224×224×3
  • 进行第一个卷积:用64个3×3的过滤器对输入图像进行卷积,输出结果是224×224×64,因为使用了same卷积,通道数量也一样,
  • 接着还有一层224×224×64,得到这样2个厚度为64的卷积层,意味着我们用64个过滤器进行了两次卷积

  • 接下来创建一个池化层,池化层将输入图像进行压缩,从224×224×64缩小到112×112×64。
  • 然后又是若干个卷积层,使用128个过滤器,以及一些same卷积,缩小到112×112×128
  • 然后进行池化,可以推导出池化后的结果是这样(56×56×128)。
  • 接着再用256个相同的过滤器进行三次卷积操作,
  • 再池化,得到28×28×256
  • 再卷积三次,使用512个过滤器,得到28×28×512
  • 再池化,得到14×14×512。如此进行几轮操作后,将最后得到的7×7×512的特征图进行全连接操作,得到4096个单元,然后进行softmax激活,输出从1000个对象中识别的结果。

参考文章:

吴恩达的深度学习-卷积神经网络,第四周

AlexNet - 知乎

卷积神经网络之VGG - 知乎


本文转载自: https://blog.csdn.net/coldstarry/article/details/135275429
版权归原作者 coldstarry 所有, 如有侵权,请联系我们删除。

“sheng的学习笔记-AI-卷积神经网络经典架构-LeNet-5、AlexNet、VGGNet-16”的评论:

还没有评论