图解卷积神经网络原理:CNN到底是如何认识一张图片
在入门深度学习的时候,卷积神经网络(CNN)始终是无法绕开的话题。在做图像分类时,输入是一张图片,最终可以将这张图片输出为一个概率,以判断它属于哪个类别的概率最大,听起来确实很神奇。接下来我们一起看看一张图片怎么变成概率数字的。
本篇文章便采用通俗易懂的图解形式为大家介绍卷积神经网络的基本理论,没有眼花缭乱的公式,只要会加减乘除便可看懂,请大家放心食用。
卷积神经网络是什么
卷积是一个运算操作,积就是乘积,至于卷是什么,在这不做专业性的阐述,反正不是内卷,待会儿大家直接看具体的加减乘除便可,后续可以详细介绍卷积的具体运算逻辑。
我们来看较早期的卷积神经网络的结构图,由 Yann LeCun 等人在1998 年提出,主要包含有卷积层、池化层(下采样层)、全连接层等。

添加图片注释,不超过 140 字(可选)
比如输入是一张数字的图片,最终的输出可能是数字的横线、圆圈等一系列特征。
这些特征可以被用作图像分类、图像生成以及图像分割等任务,也可以应用于自然语言处理领域。因此卷积神经网络说是深度学习领域的普通话,这种说法是不过分的。
内容导图

添加图片注释,不超过 140 字(可选)
卷积神经网络主要包含四大模块:卷积层、激活函数、池化层以及全连接层。
其中卷积层和全连接层稍微复杂一些,激活函数和池化层比较容易理解。
正文
卷积层
二维卷积
其实一维卷积也是有广泛应用的,只不过我们学习卷积神经网络一般都是以图像为例,图像至少就有二维。
下图为 minst 手写体的数字 8,这是一张灰度图,所谓灰度图就是只有两种颜色,黑色和白色,只不过黑色的深浅不同。

添加图片注释,不超过 140 字(可选)
在计算机的世界里,它可不认识颜色,但是它认识数数值大小,因此为了使计算机能够处理图片,我们将图片划分成多个格子。
每个格子都有一种颜色,我们根据黑色的深浅,给它们一个数字,黑色为 0,白色为 255,颜色越黑,数值越低,最范围为 0~255。此时在计算机的世界里,一张图片被表示成了一个二维矩阵)。
卷积层的主要处理单元就是卷积核,那么卷积核是如何处理一张图片的呢?
通常一张图片数字化后的矩阵长和宽是比较大的,为了简化描述,我们假定一张图片数字化后的大小是 5×5,卷积核的大小为 3×3。

添加图片注释,不超过 140 字(可选)
接下来便是卷积核对输入数据进行卷积操作:
卷积核里面的数据被称为权重,一开始是随机赋值的,第一次卷积操作从图像 (0, 0) 像素开始,由卷积核中参数与对应位置图像像素逐位相乘后累加作为一次卷积操作结果,即 1×1+ 2×0 + 3×1 + 6×0 + 7×1 + 8×0 + 9×1 + 8×0 + 7×1 = 1 + 3 + 7 + 9 + 7 = 27。
卷积核按照步长大小为 1 在输入图像上从左至右自上而下依次将卷积操作进行下去,得到下面的结果。所谓步长,就是卷积核一次移动的长度。

添加图片注释,不超过 140 字(可选)
上述卷积操作便完成了一个二维卷积核对输入数据的一次特征提取。我们可以很清晰的看到,其实所谓的卷积计算来进行特征提取,具体说来其实就是一个滑动窗口在图像上不停的进行对应位置卷积核权重与像素点相乘,最终求和的过程。
并且由于都是同一个卷积核在不停的滑动,这便是卷积核权值共享的特性。
偏置项和填充(padding)
在实际的卷积过程中,我们有时会设置偏置项和填充。 所谓的偏置项便是在一次卷积操作之后,我们会给最终的结果额外再加上或者减去一个数,使得模型更加灵活;
什么是填充呢?我们可以发现输入数据的边缘都只计算了一次,然而不在边缘的数据计算次数都大于 1,这样的话,图像边缘的像素被卷积核扫描的次数,远少于图像中心的像素。边缘区域的特征信息在训练中容易被“忽视”。但边缘信息(如物体的轮廓)通常是非常重要的! 因此我们需要在图像外围再填充一些数据,如下图所示:

添加图片注释,不超过 140 字(可选)
我们填充 0 是为了避免给图像带来噪声,这样,模型可以专注于学习真实的图像内容,而不会被虚假的边缘信息干扰。
为什么说卷积的过程是在特征提取?
这里存在两个问题:1、为什么卷积是在特征提取?2、为什么是相乘再求和,而不是取平均、相减或者是其他运算?
我们用一维卷积来举例:
情况一:
完美匹配(特征强烈存在)一个图像区域为左暗右亮,有一个清晰的垂直边缘。像素大小为 [10, 10, 10, 150, 150, 150] (暗,暗,暗,亮,亮,亮)

添加图片注释,不超过 140 字(可选)
假设我们有一个确定的卷积核(垂直边缘探测器):寻找“左暗右亮”的模式。卷积核权重为

添加图片注释,不超过 140 字(可选)
我们做一次卷积:

添加图片注释,不超过 140 字(可选)
结果值很大(420)! 卷积核很激动:“在这里!在这里!找到了一个强烈的垂直边缘!”
情况二:
完全不匹配(特征不存在) 图像区域:一片均匀的灰色,像素大小为 [100, 100, 100, 100, 100, 100] (灰,灰,灰,灰,灰,灰)

添加图片注释,不超过 140 字(可选)
同样的卷积核:

添加图片注释,不超过 140 字(可选)
我们做一次卷积:

添加图片注释,不超过 140 字(可选)
结果值为 0。 这表示:“这里什么都没有,没有检测到任何边缘。”
情况三:部分匹配或反向匹配
如果结果是很大的负数,说明匹配上了反向的模式(比如“左亮右暗”的边缘)。
如果结果接近 0,说明没有相关性。
至于为什么是卷积而不是其他运算,因为涉及到线性代数的知识,这里简单介绍一下,卷积操作的相乘再求和,它本质上是一个加权系统,强调重要的部分(通过大的权重值),忽略不重要的部分(通过小的或零的权重值),因此能够提取特征。
多维卷积
学习了二维卷积之后,我们已经明白了卷积的基本运算操作,学习多维卷积也就更好理解。多维卷积我们需要重点理解的是通道数和卷积核个数。
由于在现实世界中,颜色是由三原色构成的,所以我们实际看到的图片一般都不是灰度图,而是 RGB 彩色图像,包含红绿蓝三通道。和灰度图一样,我们需要将一张彩色图像用矩阵来进行表示,这样我们就得到了 R、G、B 三个通道的原始输入数据。
多维卷积的过程其实也是对应位置相乘再求和,如下图所示,假如我们有一个 5×5×3 的 RGB 图像(大小为 5×5,通道数为 3),此时我们的卷积核的大小的通道也应该是 3!大小可以自己定义,一般是奇数。在这里我们定义一个 3×3×3 的卷积核,与 RGB 三通道图像去进行卷积,卷积核的 3 个通道分别于输入图像的 3 个通道对位相乘再求和,此时我们会得到 3 个通道的 3×3 大小的结果,此时将 3 个通道的结果叠加求和便是一个 3 维卷积核与一个 RGB 图像的卷积结果。

添加图片注释,不超过 140 字(可选)
在这里进行一个总结来说明步长、填充与最终生成特征图大小的关系,以及卷积核个数输入通道数与输出通道数之间的关系。
卷积核深度 = 输入特征图的通道数
从上图可以看出当图像存在 RGB3 个通道时,此时卷积核的深度也为 3,并且只有一个卷积核,最终输出一张特征图,也即一个通道;
卷积核数量 = 输出特征图的通道数
我们来看下面这张图,一个卷积核得到一个输出通道的图像,当我们有 n 个卷积核时,与第一个卷积核一样的计算,我们便得到了 n 张特征图,也即 n 个通道。

添加图片注释,不超过 140 字(可选)
输出特征图大小的关系如下:
输出宽度 = (输入宽度 - 卷积核宽度 + 2 × 填充圈数) / 步长 + 1
输出高度 = (输入高度 - 卷积核高度 + 2 × 填充圈数) / 步长 + 1
我们可以计算一下,我们输入特征图的大小为宽度和长度都是 5,卷积核长款都是 3,填充圈数为 0,步长为 1,输出则为(5 - 3 + 2 ×0)/1 + 1 = 3,我们输出特征图的大小也的确为 3。有填充的大家也可以画图手动推算一下,最终的结果是 5×5。
激活函数
激活函数实际上也是生物学在数据科学上的应用,生物神经元通常有一个阈值,当神经元所获得的输入信号累积效果超过了该阈值,神经元就被激活而处于兴奋状态;否则处于抑制状态。由于卷积运算实际上是线性运算,因此能够拟合的函数有限,在加入激活函数后,最终网络的拟合能力也就大大增强。
激活函数的种类有很多,在这里主要介绍一下 ReLu 函数,它的函数很简单,当输入小于 0 时,输出就是 0,当输入大于 0 时,输出就是它自己,函数图像如下:

添加图片注释,不超过 140 字(可选)
因此经过卷积层后,我们得到一张特征图如下,我们要知道权重不一定为正数,因此计算的特征图的数值大小是存在负数的,最终经过激活函数后,得到结果。

添加图片注释,不超过 140 字(可选)
池化层
池化层某种程度上可以认为是降维,或者说进一步精确信息,将冗余信息进行更精确的描述,在这里我们也用图来说明池化的具体操作,主要分为最大池化、平均池化以及随机池化:

添加图片注释,不超过 140 字(可选)
其中池化层也是有池化核的大小和步长,只不过和卷积核不同,不是做对位相乘再求和,比如最大池化就是从池化核覆盖到的数据中,取出最大值,然后移动步长,最终得到一个处理后的特征图。顾名思义,平局池化便是对覆盖到的数求平均,随机池化便是对覆盖的数据随机取一个值。
池化层可以减小特征图的尺寸,要知道现实世界处理的数据量可是指数级别,因此通过池化操作可以有效减小运算量 。
全连接层
全连接层主要用来特征组合,在经过前面卷积、激活函数以及池化的操作之后,由全连接层来灵活处理各种输入维度,可以用来分类检测和语义分割等。比如在分类任务中,比如我们做的是一个 5 分类,最终全连接层的神经元的数量便为 5。
假设我们最终得到的特征图的大小为 2×2,我们要将它与一个神经元个数为 5 的全连接层连接,最终得到 5 个概率,认为它是概率最大的那个类别。这个过程如何实现?我看过蛮多文章,都讲的很不错,但就是不过直观,大多数时候只有一个感性的认识,很多人可能学习了几年 CNN,直接用的 torch 的库函数,也没有细究过的激机理,下面我们就探究一下全连接层到底如何工作的。
1、直观理解:flatten 展开
从下图可以看出,我们把得到的特征图展开成一维然后与全连接层的神经元去相乘再相加(在这里要注意的一点是以前我老认为一个神经元就是一个数,实际上一个神经元可以认为是一个矩阵,比如卷积核可以认为就是一个神经元),便可得到结果,后续我们在用这个结果去得到概率。

添加图片注释,不超过 140 字(可选)
此时全连接这三个字便好理解了,可以看到特征图与每个神经元都做了相乘再相加,也就是连接,所以叫全连接层,我们还可以观察出,当特征图展开长度为 4 时,此时如果我们有 5 个神经元,我们便需要用一个 4×5 的矩阵与它做矩阵相乘。
因此神经元可以简单粗暴的理解为一个二维矩阵,它的宽度为神经元个数,高度为特征图展开的长度。
2、卷积理解:特殊的一维卷积
经常有人说全连接层实际上是卷积层,讲道理很长一段时间我也没有 get 到是怎么回事,刚才我们一直在说全连接层做的实际上也是相乘再相加,这不就是卷积吗?好像有点卷积的感觉,但是还是差点意思,别着急,我们换个视角看就明白了。

添加图片注释,不超过 140 字(可选)
我们不将特征图展开,并且将全连接层换一种视角来看,将 4×5 矩阵转变为 5 个 2×2 的矩阵,我们可以发现,两者结果是一样的,而且这不刚好是卷积核与特征图的卷积操作么,只不过卷积核的大小与特征图的大小一模一样,因此全部覆盖到了,被称为全连接,此时我们想到卷积层,卷积核的比特征图小,因此没有全部覆盖到,所以我们说卷积层是局部连接的。
因此全连接层从 flatten 视角来理解就是将特征图平铺展开,并且和 5 个神经元相乘再相加;但它实质上也是用和特征图一样大小的卷积核去做卷积,卷积核的个数就是特征图平铺展开的长度。
3、概率计算
我们最终通过 softmax 函数计算出最终的概率,softmax 函数本质是将输出节点的自然之数和计算出来,然后去计算每个节点占综总和的权重,它的公式为

添加图片注释,不超过 140 字(可选)
例如之前计算出最终的结果为[0,3,0,-1,1]
步骤 1:计算每个元素的指数
e^0 = 1.000
e^3 = 20.0855
e^0 = 1.000
e^(-1) = 0.3679
e^1 = 2.7183
步骤 2:计算总和
总和 = 1.000 + 20.0855 + 1.000 + 0.3679 + 2.7183 = 25.1717
步骤 3:计算每个元素的 softmax 值
softmax(0) = 1.000 / 25.1717 = 0.0397
softmax(3) = 20.0855 / 25.1717 = 0.7980
softmax(0) = 1.000 / 25.1717 = 0.0397
softmax(-1) = 0.3679 / 25.1717 = 0.0146
softmax(1) = 2.7183 / 25.1717 = 0.1080
输入: [0, 3, 0, -1, 1] Softmax 最终输出结果: [0.0397, 0.7980, 0.0397, 0.0146, 0.1080],如果全连接层的这几个神经元分别是猫、狗、鸟、老虎以及狮子的概率,那么 0.7890 最高,所以这张图片最有可能是一只小狗。
总结
以上的内容我们就由一张图片得到了它最终可能是哪个分类的概率,我们可以总结一下它的过程:
1、卷积层:针对原始图像做对位相乘再求和,完成卷积操作,得到特征图;
2、激活函数:针对特征图决定哪些部分被激活或被抑制,增强网络的拟合能力;
3、池化层:降低特征图尺寸,精简数据量,降低计算量;
4、全连接层:通过 flatten 或者一维卷积,将前面提取到的特征进行整合,进而计算出概率;
5、softmax:通过全连接层的输出,采用 softmax 函数计算出概率,最终认为原始图像的种类。
能够读到这里已经很不容易啦,感谢屏幕前的你,能够静下心来看这篇文章,另外由于作者知识有限,难免有叙述不正确的地方,也恳请大家指出,感谢!另外大家认准我哦,在哪儿都是阿龙AI日记。

更多推荐
所有评论(0)