首页 > 编程笔记 > Python笔记 阅读:133

卷积神经网络(CNN)是什么(非常详细)

卷积神经网络(Convolutional Neural Networks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络,它是深度学习框架中的代表算法之一。

卷积神经网络的历史

卷积神经网络最早可以追溯到 1943 年,心理学家 Warren 和数理逻辑学家 Walter 在论文中第一次提出神经元的概念,通过一个简单的数学模型将神经反应简化为信号输入、求和、线性激活及输出,具有开创性意义。

1958 年神经学家 Frank 通过机器模拟了人类的感知能力,这就是最初的“感知机”,同时他在当时的 IBM704 型电子数字计算机上完成了感知机的仿真,能够对三角形和四边形进行分类,这是神经元概念提出后第一次成功的实验,验证了神经元概念的可行性。

以上是神经元发展的第一阶段。第一代神经网络结构单一,仅能解决线性问题。此外,认知的限制也使得神经网络的研究止步于此。

第二代卷积神经网络出现于 1985 年,Geoffrey Hinton 在神经网络中使用多个隐含层进行权重变换,同时提出了误差反向传播(Back Propagation,BP)算法,求解各隐含层的网络参数,优点是理论基础牢固、通用性好,不足之处在于网络收敛速度慢、容易出现局部极小的问题。

1988 年,Wei Zhang 提出平移不变人工神经网络(Shift-Invariant Artificial Neural Networks,SIANN),将其应用在医学图像检测领域。

1989 年,LeCun 构建了应用于计算机视觉问题的卷积神经网络,也就是 LeNet 的早期版本,包含两个卷积层和两个全连接层,共计 6 万多个参数,在结构上与现代的卷积神经网络模型结构相似,而且开创性地提出了“卷积”这一概念,卷积神经网络因此得名。

1998 年,LeCun 构建了更加完备的卷积神经网络 LeNet-5 并将其应用于手写字体识别,在原有 LeNet 的基础上加入了池化层,模型在 MNIST 数据集上的识别准确率达到了 98% 以上,但由于当时不具备大规模计算能力的硬件条件,因此卷积神经网络的发展并没有引起足够的重视。

第三代卷积神经网络兴起于 2006 年,统称为深度学习,分为以下阶段,2006-2012 年为快速发展期,2012 至今为爆发期,训练数据量越大,卷积神经网络的准确率越高,同时随着具备大规模计算能力 GPU 的应用,模型的训练时间大大缩短,深度卷积神经网络的发展是必然的趋势。

2006 年,Hinton 提出了包含多个隐含层的深度置信网络(Deep Belief Network,DBN),取得了十分好的训练效果,DBN 的成功实验拉开了卷积神经网络百花齐放的序幕。

自 2012 年 AlexNet 取得 ImageNet 视觉挑战赛的冠军,几乎每年都有新的卷积神经网络产生,诸如 ZFNet、VGGNet、GoogLeNet、ResNet 以及 DPRSNet 等,都取得了很好的效果。

卷积神经网络的结构

卷积神经网络中隐含层低层中的卷积层与池化层交替连接,构成了卷积神经网络的核心模块,高层由全连接层构成。

1) 卷积层

卷积层用于提取输入的特征信息,由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的,通过感受野(Filter)对输入图片进行有规律地移动,并与所对应的区域做卷积运算提取特征;低层卷积只能提取到低级特征,如边缘、线条等,高层卷积可以提取更深层的特征。

卷积层参数包括感受野大小、步长(Stride)和边界填充(Padding),三者共同决定了卷积层输出特征图的尺寸大小:

2) 激活函数层

卷积运算提取到的图像特征是线性的,但真正的样本往往是非线性的,为此引入非线性函数来解决。

激活函数使得每个像素点可以用 0 到 1 的任何数值来代表,以模拟更为细微的变化。激活函数一般具有非线性、连续可微、单调性等特性。

比较常用的激活函数有 Sigmoid 函数、Tanh 函数以及 ReLU 函数。

3) 池化层

池化层的作用是压缩特征图,提取主要特征,简化网络计算的复杂度。

池化方式一般有两种,分别是均值池化与最大池化,如下图所示:


图 1 池化操作

图 1 中采用一个 2×2 的感受野,步长为 2,边界填充为 0。最大池化即在 2×2 的区域中寻找最大值;均值池化则是求每一个 2×2 区域中的平均值,得到主要特征。

一般最常用的感受野取值为 2,步长为 2,池化操作将特征图缩小,有可能影响网络的准确度,但可以通过增加网络深度来弥补。

4) 全连接层

全连接层位于卷积神经网络的最后,用于给出最后的分类结果,在全连接层中,特征会失去空间结构,展开为特征向量,并把由前面层级所提取到的特征进行非线性组合得到输出,可用以下公式表示:
f(x)=W*x+b
其中,x 为全连接层的输入,W 为权重系数,b 为偏置。

全连接层连接所有特征输出至输出层,对于图像分类问题,输出层使用逻辑函数或归一化指数函数输出分类标签。在图像识别问题中,输出层输出为物体的中心坐标、大小和分类。在语义分割中,则直接输出每个像素的分类结果。

卷积神经网络的类型

1) AlexNet

AlexNet是一种具有里程碑意义的深度卷积神经网络,由 Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton 在 2012 年提出。

AlexNet 在 2012 年的 ImageNet 大规模视觉识别挑战赛(ImageNet Large Scale Visual Recognition Challenge,ILSVRC)上取得了突破性的成绩(获得冠军),这一成就标志着深度学习时代的来临,并奠定了卷积神经网络在计算机视觉领域的绝对地位。

我们可以从以下几个方面来了解 AlexNet:
① 创新技术:AlexNet 的成功在于其引入了一些新的技术和训练方法,包括 ReLU 激活函数、Dropout 正则化以及使用 GPU 进行加速训练。这些技术的应用极大地提高了网络的性能,并且对后续的深度学习模型设计产生了深远的影响。

② 网络结构:AlexNet 的网络结构包括 5 个卷积层和 3 个全连接层。它的输入图像尺寸为 227×227×3(实际输入尺寸应为 227×227,由于卷积核大小和步长的设置,之前有文献提到 224×224)。网络中使用了 96 个 11×11 的卷积核对输入图像进行特征提取,步长为 4,没有使用填充。

③ 影响与贡献:AlexNet 不仅在 ImageNet 竞赛中取得了优异的成绩,更重要的是,它的出现引发了深度学习研究的热潮。AlexNet 之后,更多、更深的神经网络模型被提出,如 VGG、GoogLeNet 等,这些模型在传统的机器学习分类算法基础上取得了显著的提升。

AlexNet 的网络结构如图下所示:


图 2 AlexNet 的网络结构

AlexNet 的成功除归功于深层次的网络结构外,还有以下几点:

2) VGGNet

VGGNet 是牛津大学与 Google DeepMind 公司的研究员一起合作开发的卷积神经网络,2014年取得了 ILSVRC 比赛分类项目的亚军和识别项目的冠军。

VGGNet 探索了网络深度与其性能的关系,通过构筑 16~19 层深的卷积神经网络,Top5 误差率为 7.5%,在整个卷积神经网络中,全部采用 3×3 的卷积核与 2×2 的池化核,网络结构如下图所示。


图 3 VGGNet网络结构

VGGNet 包含很多级别的网络,深度从 11 层到 19 层不等,最常用的是 VGG-16 和 VGG-19。VGGNet 把网络分成了 5 段,每段都把多个 3×3 的网络串联在一起,每段卷积后接一个最大池化层,最后是 3 个全连接层和一个 Softmax 层。

VGGNet 有两个创新点:
① 通过网络分段增加网络深度,采用多层小卷积代替一层大卷积,两个 3×3 的卷积核相当于 5×5 的感受野,三个相当于 7×7 的感受野。优势在于:首先包含三个 ReLU 层,增加了非线性操作,对特征的学习能力更强;其次减少了参数,使用 3×3 的 3 个卷积层需要 27×n 个参数,使用 7×7 的一个卷积层需要 7×7×n=49×n 个参数。

② 在训练过程中采用多尺度和交替训练的方式,同时对一些层进行预训练,使得 VGGNet 能够在较少的周期内收敛,减轻了神经网络训练时间过长的问题。不足之处在于使用三个全连接层,参数过多导致内存占用过大,耗费过多的计算资源。VGGNet 是最重要的神经网络之一,它强调了卷积网络深度的增加对于性能的提升有着重要的意义。

3) GoogLeNet

GoogLeNet 是由谷歌的研究院提出的卷积神经网络,获得了 2014 年的 ILSVRC 比赛分类任务的冠军,Top5 误差率仅为 6.656%。

GoogLeNet 的网络共有 22 层,但参数仅有 700 万个,比之前的网络模型少很多。一般来说,提升网络性能最直接的办法就是增加网络深度,随之增加的还有网络中的参数,但过量的参数容易产生过拟合,也会增大计算量。

GoogLeNet 采用稀疏连接解决这种问题,为此提出了 inception 结构,如下图所示:


图 4 GoogLeNet 网络结构

在 inception 结构中,同时采用 1×1、3×3、5×5 卷积核是为了将卷积后的特征保持一致,便于融合,stride=1,padding 分别为 0、1、2,卷积后就可得到相同维度的特征,最后进行拼接,将不同尺度的特征进行融合,使得网络可以更好地提取特征。

在整个网络中,越靠后提取到的特征就越抽象,每个特征所对应的感受野也随之增大,因此随着层数的增加,3×3、5×5 卷积核的比例也会随之增加,这样会带来巨大的参数计算,为此 GoogLeNet 有过诸多改进版本,GoogLeNet Inception V2、V3 以及 V4,通过增加 Batch Normalization、在卷积之前采用 1×1 卷积降低纬度、将 n×n 的卷积核替换为 1×n 和 n×1 等方法减少网络参数,提升网络性能。

4) ResNet

ResNet 于 2015 年被提出,获得了 ILSVRC 比赛的冠军,ResNet 的网络结构有 152 层,但 Top5 错误率仅为 3.57%,之前的网络都很少有超过 25 层的,这是因为随着神经网络深度的增加,模型准确率会先上升,然后达到饱和,持续增加深度时,准确率会下降;因为随着层数的增多,会出现梯度爆炸或衰减现象,梯度会随着连乘变得不稳定,数值会特别大或者特别小;因此,网络性能会变得越来越差。

ResNet 通过在网络结构中引入残差网络来解决此类问题,残差网络结构如下图所示。


图 5 残差网络结构

很明显,残差网络是跳跃结构,残差项原本是带权重的,但 ResNet 用恒等映射代替了它。在图 5 中,输入为 x,期望输出为 H(x),通过捷径连接的方式将 x 传到输出作为初始结果,输出为 H(x)=F(x)+x ,当 F(x)=0 时,H(x)=x。

于是,ResNet 相当于将学习目标改变为目标值 H(x) 和 x 的差值,也就是所谓的残差 F(x)=H(x)-x,因此,后面的训练目标就是要将残差结果逼近于 0。

ResNet 通过提出残差学习,将残差网络作为卷积神经网络的基本结构,通过恒等映射来解决因网络模型层数过多导致的梯度爆炸或衰减问题,可以最大限度地加深网络,并得到非常好的分类效果。

相关文章