文章目录
- 引言
- 1.卷积神经网络(CNN)的诞生背景
- 2.卷积神经网络(CNN)介绍
-
- [2.1 什么是卷积神经网络?](#2.1 什么是卷积神经网络?)
- [2.2 卷积神经网络(CNN)的基本特征](#2.2 卷积神经网络(CNN)的基本特征)
-
- [2.2.1 局部感知(Local Connectivity)](#2.2.1 局部感知(Local Connectivity))
- [2.2.2 权值共享(Weight Sharing)](#2.2.2 权值共享(Weight Sharing))
- [3. 卷积神经网络(CNN)结构](#3. 卷积神经网络(CNN)结构)
-
- [3.1 整体架构](#3.1 整体架构)
- [3.2 卷积层(Convolutional Layer)](#3.2 卷积层(Convolutional Layer))
-
- [3.2.1 卷积层涉及的参数:](#3.2.1 卷积层涉及的参数:)
- [3.3 池化层(Pooling Layer)](#3.3 池化层(Pooling Layer))
- [3.4 常用激活函数](#3.4 常用激活函数)
-
- [3.4.1 激活函数的作用](#3.4.1 激活函数的作用)
- [3.4.2 ReLU 激活函数](#3.4.2 ReLU 激活函数)
- [3.4.3 Sigmoid 激活函数](#3.4.3 Sigmoid 激活函数)
- [3.4.4 Tanh 激活函数](#3.4.4 Tanh 激活函数)
- [3.5 全连接层(Fully Connected Layer)](#3.5 全连接层(Fully Connected Layer))
- [3.6 卷积神经网络的过程](#3.6 卷积神经网络的过程)
- [4. 经典CNN架构演进](#4. 经典CNN架构演进)
- [5. 总结](#5. 总结)
引言
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络 (Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。本文旨在介绍CNN的基本概念和结构,以及CNN网络架构设计的基本思路。
1.卷积神经网络(CNN)的诞生背景
在传统神经网络处理图像时,面临几个严峻挑战:
- 参数爆炸:一张普通1000×1000像素的彩色图像,全连接层会产生30亿个参数
- 平移不变性:传统网络难以识别位置变化的同一物体
- 局部相关性:忽略了图像中相邻像素间的紧密关系
受生物视觉皮层启发,Yann LeCun等人在1989年提出了CNN的雏形,并在1998年开发出著名的LeNet-5用于手写数字识别。但直到2012年AlexNet在ImageNet竞赛中一战成名,CNN才真正迎来爆发式发展。
2.卷积神经网络(CNN)介绍
2.1 什么是卷积神经网络?
卷积神经网络是多层感知机 (MLP)的变种,由生物学家休博尔和维瑟尔 在早期关于猫视觉皮层的研究发展而来,视觉皮层的细胞存在一个复杂的构造,这些细胞对视觉输入空间的子区域非常敏感,称之为感受野 。
CNN由纽约大学的Yann Lecun (杨立昆)于1998年提出(LeNet-5),其本质是一个多层感知机,成功的原因在于其所采用的局部连接和权值共享的方式:一方面减少了权值的数量使得网络易于优化;另一方面降低了模型的复杂度、减小了过拟合 的风险。 当网络的输入为图像时,这些优点将表现地更加明显。
2006年,Hinton提出了深度学习,其主要的观点是:多隐层的人工神经网络 具有优异的特征学习能力,学习到的数据更能反映数据的本质特征有利于可视化或分类。大数据和计算机硬件的发展使得深度学习得以推广和应用。
2012年AlexNet取得ImageNet比赛的分类任务的冠军,使得卷积神经网络真正爆发。如今的卷积神经网络(CNN)是一种带有卷积结构的深度神经网络 ,卷积结构可以减少深层网络占用的内存量,其三个关键的操作------局部感受野 、权值共享、pooling层,有效地减少了网络的参数个数,缓解了模型的过拟合问题。
2.2 卷积神经网络(CNN)的基本特征
2.2.1 局部感知(Local Connectivity)

图1(a)表示神经网络中神经元之间的全连接结构,即前后两层神经元都是彼此相互连接的,这样可以保证后面一层的每个神经元都能获取前面一层神经元的所有信息。图1(b)表示神经元之间进行局部连接,即后面一层的神经元只与前面一层的部分神经元进行连接,这样后面一层的神经元只能包含前面一层神经元的部分信息。表面上看局部连接似乎损失了部分信息,但实际上后层神经元并没有损失信息。通过后面一层神经元感知局部信息不仅可以减少网络需要学习的大量参数,同时可以减少网络的冗余信息。在图像领域,如果网络输入的是一张图片,每个神经元在卷积层都进行局部感知图像信息,经过几层卷积和池化后再通过卷积可以将这些局部的信息进行综合起来得到图像的全局信息。通过局部感知不仅减少了神经网络的复杂性和参数量,同时减少了对训练时设备算力的高要求。
下面分析网络采用局部的神经元连接方式相比于全连接方式,计算量减少了多少。
假设图像大小为 500 × 500 ,共有 1 0 5 10^5 105 个神经元。
在图中(a)的全连接中,每个神经元需要与图像进行全连接,则网络需要训练的参数有:
- 前一层的图像大小为 500 × 500 =2.5× 1 0 5 10^5 105,然后神经元个数为 1 0 5 10^5 105个,那么全连接需要计算的参数个数为:2.5× 1 0 5 10^5 105 × 1 0 5 10^5 105 = 2.5 × 1 0 10 10^{10} 1010
如果网络神经元采用图中(b)的局部连接方式,假设神经元的感受野为 10 × 10,则网络需要训练的参数有:
- 感受野为 10 × 10 ,神经元个数为 1 0 5 10^5 105个,那么需要训练的参数个数为 10 × 10 × 1 0 5 10^5 105 = 1 0 7 10^7 107
由于神经元个数相同,偏置值的数量也是相同的,故在计算中忽略了偏置值的统计,该操作不影响两者计算量的比较。通过比较两种连接方式计算的结果可知,采用局部连接方式的参数量是采用全连接方式的 1 2500 \frac{1}{2500} 25001 。由此可见,神经元采用局部连接可以减少大量网络需要学习的参数,降低模型的复杂度。
2.2.2 权值共享(Weight Sharing)
权值共享是卷积神经网络的另一个特性。在网络对输入图片进行卷积时,对于同一特征的提取,卷积核的参数是共享的,即卷积核中的参数是相同的。在全图对某一个特征,如边缘、纹理等进行提取时,所有卷积核参数相同。这种特性大大减少了卷积神经网络中需要学习的参数,下图是神经网络权值共享示意图。
图中,第 n + 1 层神经元只与第 n层的部分神经元进行连接,该图中第 n + 1层只与第 n层中的 3 个神经元连接,每一个神经元与上一层的神经元进行连接时,权值是相同的。w1,w2,w3 是不同神经元共享的权值。
权值共享就是说,给一张输入图片,用一个卷积核去扫这张图,卷积核里面的数就叫权重 ,这张图每个位置是被同样的卷积核扫的,所以权重是一样的,也就是共享。
这里面,最左边的可以理解为是输入图片的一部分,而中间的是卷积核,右边的是得到FeatureMap。这里的动图演示的是通道数为1的情况(显示情况下,Channel = 1 一般为灰度图)。如果是彩色图像(RGB),那么左边的通道数为3(即有RGB各3张图),中间卷积核的通道数也应该是3(对应输入图片的RGB 3 通道)。
我们需要注意一下:右边输出的FeatureMap的通道数并不是3,而是1。
- 这是因为,即便输入特征图和卷积核都是3通道的,但输出特征并不是三通道的,而是把这三个通道对应位置上的值进行了相加,最终形成了一个 1通道的输出特征图。
而且我们还要注意一个问题,那就是卷积核上的参数是不变的。这就是我们所说的权值共享技巧。如果我们不进行权值共享,那么结果会这样:
3. 卷积神经网络(CNN)结构
3.1 整体架构

上面是一个简单的 CNN 结构图, 第一层输入图片, 进行卷积(Convolution)操作, 得到第二层特征图(Feature Map). 对第二层的特征图进行池化(Pooling)操作, 得到第三层特征图,重复上述操作得到第五层特征图, 最后将这特征图、按行展开连接成向量, 传入全连接(Fully Connected)层, 全连接层就是一个 BP 神经网络. 图中的每个特征图都可以看成是排列成矩阵形式的神经元, 与 BP神经网络中的神经元大同小异。
3.2 卷积层(Convolutional Layer)
卷积操作是CNN的灵魂,通过滑动窗口(滤波器/kernel)在图像上提取局部特征,所以,一幅图像的一个完整的卷积运算过程为:卷积核以一定的间隔滑动,并对所覆盖的区域进行卷积运算得到值 z,直至遍历完整幅图像。如下图所示:
我们都知道,彩色图片都是三个通道,也就是说一个彩色图片会有三个矩阵。加入现在输入一张彩色图片的尺寸为7×7×3,最后一维3表示图像颜色通道,需要注意的是输入的最后一维要和Filter的最后一维保持一致。Filter为3×3×3,那么这里的卷积核大小为3×3,对应输入矩阵中每3×3的大小进行一个区域选择。
计算方式为: 每一个对应位置相乘,最终结果相加,最后不要忘记加上偏置项
如下图所示:
而卷积操作并不是说卷积一次就完事了,而是可以进行多次卷积,得到若干张特征图,最后进行堆叠。
3.2.1 卷积层涉及的参数:
(1)滑动窗口步长(Stride)
从图中可以看出,不同的步长得到的特征图大小也不同。当步长较小时,相当于慢慢的提取特征,细粒度的提取特征,特征提取的较为丰富;当步长较大时,相当于大刀阔斧的提取特征,特征数目较少。
(2)滤波器尺寸(通常3×3或5×5)
其实和滑动窗口的尺寸一样,当卷积核尺寸较小时,相当于慢慢的提取特征,细粒度的提取特征,特征提取的较为丰富;当卷积核尺寸较大时,相当于大刀阔斧的提取特征,特征数目较少。
在一般情况下, 滑动窗口选择1,卷积核尺寸为3×3.
(3)填充(Padding)
在滑动窗口移动过程中,我们会发现,有些位置的值被多次计算,那么这些值会对最终的结果影响较大,这样会造成不公平的效果。
解决方法:zero-padding 经过观察发现,越靠近边缘位置的值计算重复越少,越靠近中心位置的值计算次数越多,因此可以在输入特征矩阵外再添加一圈0,使得原本边界的特征被利用的次数增多,在一定程度上弥补了边界信息缺失,边界特征提取不充分的问题。

那么为啥添加的是0 ,而不是其他值呢? 如果添加其他值则会再计算过程中对最终的结果产生影响。
(4)卷积核个数
卷积核个数取决于最终在计算过程中得到多少个特征图,10个特征图也就对应10个卷积核。
3.3 池化层(Pooling Layer)
随着模型网络不断加深,卷积核越来越多,要训练的参数还是很多,而且直接拿卷积核提取的特征直接训练也容易出现过拟合的现象。CNN使用的另一个有效的工具被称为"池化(Pooling)"出现并解决了上面这些问题,为了有效地减少计算量,池化就是将输入图像进行缩小,减少像素信息,只保留重要信息;为了有效地解决过拟合问题,池化可以减少数据,但特征的统计属性仍能够描述图像,而由于降低了数据维度,可以有效地避免过拟合。
给出池化的定义,对不同位置区域提取出有代表性的特征(进行聚合统计,例如最大值、平均值等),这种聚合的操作就叫做 池化,池化的过程通常也被称为 特征映射 的过程(特征降维)。听起来很高深,其实简单地说就是下采样。
池化的过程如下图所示:
池化主要有两种,除了 最大值池化(Max Pooling) 之外,还有 平均值池化(Average pooling),CNN中随机池化使用的较少。
最大池化是对局部的值取最大;平均池化是对局部的值取平均;随机池化是根据概率对局部的值进行采样,采样结果便是池化结果。概念非常容易理解,其示意图如下所示:
三种池化的意义:
- 最大池化可以获取局部信息,可以更好保留纹理上的特征。如果不用观察物体在图片中的具体位置,只关心其是否出现,则使用最大池化效果比较好。
- 平均池化往往能保留整体数据的特征,能凸出背景的信息。
- 随机池化中元素值大的被选中的概率也大,但不是像最大池化总是取最大值。随机池化一方面最大化地保证了Max值的取值,一方面又确保了不会完全是max值起作用,造成过度失真。除此之外,其可以在一定程度上避免过拟合。
3.4 常用激活函数
3.4.1 激活函数的作用
非线性建模:激活函数的主要作用是提供网络的非线性建模能力。在卷积层中,卷积操作是线性的,即对每个像素点赋予一个权值进行加权求和。然而,对于实际样本来说,不一定是线性可分的。为了解决这个问题,需要引入非线性因素,使网络能够学习更复杂的函数关系。(如果只有线性变换,那无论多少层神经元,都能简化层一层神经元,那神经网络只是简单多元线性回归而已,不能拟合更加复杂的函数。举个例子,只有线性操作,那么神经网络永远无法拟合圆等复杂的曲线图形,永远只能表示超平面,无法表示曲面等。)
构建稀疏矩阵:激活函数还可以构建稀疏矩阵,即稀疏性。这个特性可以去除数据中的冗余,最大可能地保留数据的特征。大多数为0的稀疏矩阵可以更有效地表示数据,从而提高模型的泛化能力。
激活函数的非线性是神经网络发挥作用最重要的因素之一,而对于实际部署,激活函数的实现也是很重要的一个方面,实现的不好对加速效果影响很大,这里主要讲几个部署当中常见的激活函数。
3.4.2 ReLU 激活函数
公式:
ReLU比较好部署,小于0的部分为0,大于0的部分为原始值,只需要判断一下符号位就行。
3.4.3 Sigmoid 激活函数
公式:
Sigmoid 函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。它在物理意义上最为接近生物神经元。
3.4.4 Tanh 激活函数
公式:
比Sigmoid函数收敛速度更快,相比Sigmoid函数,其输出以0为中心。
3.5 全连接层(Fully Connected Layer)
将特征向量转化为分类概率,分类概率是指将输入图片判定的概率。全连接层通常作为CNN的最后一层,对图像的特征进行分类并得出最终的输出结果。
全连接层的工作方式是将图像的特征向量作为输入,通过一组权值,计算得到一个分类结果。全连接层中的每一个神经元代表一个特定的类别,最后的输出即为所属类别的概率。

在经过多层的卷积层和池化层操作后,一般会有1个或2个全连接层,给出最后的分类结果。全连接层在整个卷积神经网络中起到"分类器"的作用,它将学到的特征表示映射到类标签空间。在实际中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1×1的卷积;而前层是卷积层的全连接层可以转化为卷积核为h×w的全局卷积,h和w分别为前层卷积输出结果的高和宽。
3.6 卷积神经网络的过程
首先需要一张图片进行输入,在输入之后需要对其进行卷积操作,用于特征提取,在特征提取过后,需要用激活函数对所得到的特征图进行激活。在激活之后,需要利用池化去进行降低尺寸,在降低尺寸之后,又要重新进行卷积激活,然后再进行池化,就这样不停循环下去,直到这个神经网络的规模能够满足我们全连接层计算,那我们就进入全连接层,然后在全连接层中进行详细的计算以及进行分类,这就是卷积神经网络CNN的一个整体的过程。
通过观察图,我们发现了几个特点:
- 首先每一个卷积过后都连接一个Relu激活函数;
- 每两次卷积后进行一次池化操作;
- 所有的卷积和池化操作完成后进行全连接FC,
- 全连接层得到最终的分类结果。
4. 经典CNN架构演进
模型 | 年份 | 创新点 | Top-5错误率 |
---|---|---|---|
LeNet-5 | 1998 | 首个成功CNN | - |
AlexNet | 2012 | ReLU/Dropout | 15.3% |
VGG | 2014 | 小卷积堆叠 | 7.3% |
GoogLeNet | 2014 | Inception模块 | 6.7% |
ResNet | 2015 | 残差连接 | 3.57% |
5. 总结
以上就是本篇博客的全部内容了,真的耗费了我不少时间来总结,希望可以和大家一起学习、进步。大家如果发现博客中有表述不正确的的地方还望能及时指正,谢谢大家!
人生海海,山山而川。希望大家能一直保持初心,坚定目标,并为之努力奋斗,终有一天,我们都能成为心中所想成为的人!
本篇博客就到这里啦,大家下篇博客见!