目录
- 1 什么是 CNN
- 2 输入层
- 3 卷积层
- 3.1 卷积操作
- 3.2 Padding 零填充
- 3.3 处理彩色图像
- 4 池化层
- 4.1 池化操作
- 4.2 池化的平移不变性
- 5 全连接层
- 6 输出层
前言
- 这篇博客不够详细,因为没有介绍卷积操作的具体计算;
- 但是它介绍了 CNN 各层次的功能,提供了一个全局的视野。
参考博客
- 卷积神经网络(CNN)详细介绍及其原理详解
1 什么是 CNN
卷积神经网络 CNN 通常被用于图像处理,比如下图的手写数字辨识过程:
可以看出,整个过程由以下几层组成:
- 输入层:输入图像等信息;
- 卷积层:用于提取图像的底层特征;
- 池化层:防止过拟合,即将数据的维度减小;
- 全连接层:汇总卷积层和池化层得到的图像的底层特征和信息;
- 输出层:根据全连接层的信息得到概率最大的结果。
其中最重要的就是卷积层,这也是卷积神经网络名称的由来。接下来,我们将对这些层进行详细的介绍。
个人理解:上图中的红色方框表明,黑色线所指向位置的元素是由红色方框内的元素计算出来的。
2 输入层
CNN 的输入层用于将输入的图像转换为由像素值构成的二维矩阵,并存储该二维矩阵以等待后续操作。与人眼不同,计算机能够处理的图像是一个二维矩阵,该二维矩阵是由图像的每一个像素的像素值组成的。如下图所示,手写数字 8 8 8 的图像被计算机读取为一个二维矩阵:
图 (a) 是一个灰度图像,这是因为其每个像素值的范围在
[
0
,
255
]
[0,255]
[0,255] 之间,表示其颜色的强弱程度。除灰度图像外还有黑白图像,黑白图像的每个像素值要么是
0
0
0,要么是
255
255
255。而日常生活中最常见的是
R
G
B
\mathrm{RGB}
RGB 图像,这种图像有三个通道,分别是:红色、绿色、蓝色。每个通道的每个像素值的范围也是在
[
0
,
255
]
[0,255]
[0,255] 之间,表示其颜色的强弱程度。
由于灰度图像的值范围较小、颜色较单一,因此比较好操作,所以我们通常处理的都是灰度图像。在某些情况下, R G B \mathrm{RGB} RGB 图像在输入神经网络之前也会被转化为灰度图像,这就是因为处理三个通道的计算量非常大。不过随着计算机性能的高速发展,现在有些神经网络也可以直接处理 R G B \mathrm{RGB} RGB 图像。
3 卷积层
一旦图片被输入网络,它将被转换成一个二维矩阵。为了提取该矩阵中的特征,卷积操作被应用于该矩阵。该操作通过计算每个像素与卷积核(Convolution Kernel)的点积,为图像中具有特征的区域赋予高值,为不具有特征的区域赋予低值。
注意:想要提取什么样的特征,就要使用什么样的卷积核。比如:想要提取原始图像中眼睛这一特征,就要使用具有眼睛特征的卷积核。
3.1 卷积操作
卷积核本质上也是一个二维矩阵,其尺寸通常小于或等于输入图像的二维矩阵。在卷积操作中,卷积核在输入图像矩阵上逐像素移动,并在每次移动后执行像素值的点积运算。将所有这些点积的和赋予当前卷积核位置对应的输出矩阵中的相应像素值。如下图所示:
通过卷积核不断地移动和计算(逐元素相乘再相加),我们得到了一个新的二维矩阵,该二维矩阵被称为特征图(Feature Map),也就是图像中最有用的特征。此外,不难看出卷积操作是一个降维的过程,因为特征图的维度比原始图像的二维矩阵小。
在上图中,红色矩阵是图像的二维矩阵,蓝色矩阵是卷积核,紫色矩阵是特征图。
为了进行更加生动形象的说明,我们以提取人脸图像中的眼睛为例,选取眼睛作为卷积核,并在整个头部图像上移动,以识别和定位眼睛的位置。如下图 (a)(b)(c) 所示:
为了强调我们提取到的人眼特征,我们可以假设高值为白色,低值为黑色,并对特征图进行上色处理,如上图 (d) 所示。说明:由于黑色实在是太辣眼睛了,因此我实际上用的是灰色。
由向量乘法的几何意义可知,两个向量越相似,其乘积结果越大。因此当卷积核移动到眼睛部分时,它们的卷积结果较大,即上图中的 100 100 100。
3.2 Padding 零填充
可以从上一节的动图看出,边缘的像素只被计算了一次,而中间的像素被计算了多次,从而造成了边缘特征的丢失。为了克服这一问题,通常在原始输入图像的二维矩阵周围添加额外的边缘像素,即进行零填充(Padding)。如此一来,每个像素都能够获得相同的计算机会,确保了特征图不会丢失边缘区域的重要特征。
P a d d i n g = 1 \mathrm{Padding = 1} Padding=1,即扩展 1 1 1 圈
P a d d i n g = 2 \mathrm{Padding = 2} Padding=2,即扩展 2 2 2 圈
注意:上面两张动图中,蓝色矩阵是图像的二维矩阵,透明灰色矩阵是卷积核,绿色矩阵是特征图。
3.3 处理彩色图像
已知每张彩色图像都有三个通道,即三个二维矩阵。假设我们使用两组卷积核来提取图像特征,如下图所示:
其中一组卷积核对应提取出一个特征图,每组中的一个卷积核对应提取一个通道的特征。不难看出,有多少组卷积核就会有多少个特征图。特征图中的一个元素,等于三个通道的卷积结果之和,再加上偏置项。比如:上图中的 1 1 1 等于 1 + ( − 1 ) + 0 + 1 1+(-1)+0+1 1+(−1)+0+1。偏置项 b i a s \mathrm{bias} bias 就是每组最后的那个 1 × 1 1\times 1 1×1 矩阵。
注意:特征图的个数等于卷积核的组数,而不是卷积核的个数!
4 池化层
在上一节中,我们讲到有多少组卷积核就会有多少个特征图。但是随着特征图的增多,我们必须考虑一个重要的问题:并非所有的特征图都是必需的。而且多余的特征图可能会带来如下两个问题:
- 过拟合
- 维度过高
为了解决这个问题,我们使用了池化层。
4.1 池化操作
池化层又称为下采样,其作用在于在卷积操作之后对特征图进行降维,通过提取最显著的特征信息来减少数据量,从而起到减小过拟合和降低维度的作用。
池化过程类似于卷积过程,也是让一个固定大小的窗口在图片上进行移动,每次我们选取窗口内最具代表性的特征。那么如何提取出最具代表性的特征呢?通常有以下两种方法。
最大池化
最大池化是指每次选取窗口内所有值的最大值,认为这个最大值就是当前位置最具代表性的特征。该过程如下图所示:
参数说明:
- ① k e r n e l − s i z e = 2 \mathrm{kernel_{-}size} = 2 kernel−size=2:是指窗口的维度为 2 × 2 2\times2 2×2;
- ② s t r i d e = 2 \mathrm{stride} = 2 stride=2:是指窗口每次移动两格位置;
- ③ p a d d i n g = 0 \mathrm{padding} = 0 padding=0:是指零填充的圈数,如果值为 0 0 0 则表明没有扩展。
平均池化
平均池化是指每次选取窗口内所有值的平均值,即考虑了每个位置的值对该位置特征的影响。该过程如下图所示:
池化层的优点总结如下:
- 减少参数量的同时保留图像的原始特征;
- 有效地防止过拟合;
- 为 CNN 带来平移不变性;
前两个优点我们之前已经介绍过了,那么什么又是平移不变性呢?
4.2 池化的平移不变性
如图 (a) 所示,两张图片的内容都是人脸,但是下图的人脸稍稍左移了一点。如图 (b) 所示,经过卷积操作后得到各自的特征图。
其中上图的眼睛特征的位置正常,下图的眼睛特征的位置稍稍左移了一点。尽管人类能够识别出眼睛的位置,但是当通过神经网络进行计算时,可能会引入误差,原因是网络未能在预期位置上正确地识别出眼睛。针对这种情况,应当采取何种措施呢?
如图 (c) 所示,使用池化层执行池化处理后,观察到尽管在池化前两张图像的眼睛特征位于不同位置,但经过池化处理后,这些特征的位置均统一。这极大地便利了后续神经网络的计算,并且体现了池化操作的平移不变性。
5 全连接层
假设在上述头部图像示例中,我们已经通过卷积操作和池化操作提取了眼睛、鼻子和嘴巴的特征。若要利用这些特征来判断图像是否为人体头部,需要对所有提取出的特征图进行 “展平” 操作,即将其维度转换为 1 × n 1\times n 1×n 的形式,该过程被称为全连接。如下图所示:
也就是说,全连接层将提取出的特征图展开成一维向量。随后通过计算产生一个概率值,该值表示原始图像是人体头部图像的概率。
个人理解:上图中每个特征图的维度是 5 × 5 5\times 5 5×5,展开成一维向量后的维度是 1 × 25 1\times 25 1×25,拼接起来送入神经元时的维度是 1 × 75 1\times 75 1×75。
6 输出层
输出层用于对全连接层输出的一维向量进行计算,如下图所示:
其中的计算可能是线性的,也可能是非线性的。在深度学习中,鉴于通常需要处理多分类任务,输出层每个位置都会产生一个概率值,代表属于当前位置对应类别的概率。选择概率值最大的类别作为最终的识别结果。在训练过程中,通过不断调整网络的参数,提高识别的准确率。