卷积神经网络是多层感知机(MLP)的变种。卷积神经网络(Convolutional Neural Networks)是一种包含卷积计算且具有深度结构的前馈神经网络,CNN具有表征学习的能力,能够按阶层对输入数据进行平移不变分类。CNN的设计灵感来源于动物视觉系统分级处理信息的能力,即较低层的神经网络提取图像的浅层特征(如边缘信息),较高层的神经网络提取图像的深层特征(如图像的某个像素块),最终得到图像的整体特征。CNN可以进行监督学习和非监督学习,其隐含层内的卷积核参数共享和层间连接的稀疏性使得卷积神经网络能够以较小的计算量对格点化特征。

一  图像的原理

      计算机能够处理的图片是数字组成的矩阵的形式。

      灰度图通常以二维矩阵的形式存储和处理,这个矩阵就是由图像每一个像素的像素值大小组成的,其每一个像素值的范围是0~255(由纯黑色到纯白色),表示其颜色强弱程度,0表示最暗,255表示最亮。如下图:

      而更普遍的图片表达方式是RGB颜色模型,有三个通道,分别是红色、绿色、蓝色。每个通道的每个像素值的范围也是0~255,表示其每个像素的颜色强弱,红、绿、蓝三原色的色光以不同的比例相加,以产生多种多样的色光。RGB颜色模型的图片,可以看成有序排列的三个矩阵,也可以用三维张量去理解。其中的每一个矩阵又叫这个图片的一个channel(通道),称为宽,高,深。

      有些RGB图像在输入给神经网络之前也被转化为灰度图像,也是为了方便计算,否则三个通道的像素一起处理计算量非常大。

二 CNN如何识别图像

      当我们给定一个"X"的图案,计算机怎么识别这个图案就是“X”呢?

      当使用全连接神经网络处理大尺寸图像时,办法就是计算机存储一张标准的“X”图案,然后把需要识别的未知图案跟标准"X"图案进行比对,如果有任何一个像素值不匹配,那么这两幅图就不匹配。这么做,显然是非常不可靠的。我们希望,对于那些仅仅只是做了一些像平移,缩放,旋转,微变形等简单变换的图像,计算机仍然能够识别出图中的"X",如下所示:

      使用全连接神经网络处理图像有三个非常明显的缺点:

(1)将图像展开为向量会丢失空间信息;

(2)参数过多效率低下,训练困难;

(3)大量的参数也很快会导致网络过拟合。

      卷积神经网络则可以很好地解决以上三个问题。

      CNN能做到即便未知图案可能有一些平移或稍稍变形,依然能辨别出它是一个X图案。如此,CNN是把未知图案和标准X图案一个局部一个局部的对比,它拿来比对的这个“小块”我们称之为Features(特征)。在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性。如下图所示:

      而未知图案的局部和标准X图案的局部一个一个比对时的计算过程,便是卷积操作。卷积计算结果为1表示匹配,否则不匹配。

三 什么是卷积

      假设我们已经得到图片的二维矩阵了,想要提取其中特征,那么卷积操作就会为存在特征的区域确定一个高值,否则确定一个低值。这个过程需要通过计算其与卷积核(Convolution Kernel)的乘积值来确定。假设我们现在的输入图片是一个人的脑袋,而人的眼睛是我们需要提取的特征,那么我们就将人的眼睛作为卷积核,通过在人的脑袋的图片上移动来确定哪里是眼睛,这个过程如下所示:

      通过整个卷积过程又得到一个新的二维矩阵,我们可以将得到的特征图进行上色处理(我只是打个比方,比如高值为白色,低值为黑色),最后可以提取到关于人的眼睛的特征,如下所示:

      将上述原理进行抽象。

      在卷积神经网络中,卷积操作就是用一个可移动的小窗口来提取图像中的特征,这个小窗口包含了一组特定的权重(一个矩阵),通过与图像的不同位置进行卷积操作,网络能够学习并捕捉到不同特征的信息。这组特定权重可以被看作是一个特定的滤波器(filter)或卷积核。简言之,对图像和滤波矩阵(一组固定的权重)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作

      卷积核是一个二维矩阵,当然这个二维矩阵要比输入图像的二维矩阵要小或相等,卷积核通过在输入图像的二维矩阵上不停的移动,每一次移动都进行一次乘积的求和,作为此位置的值,这个过程如下图所示:

      动图中,下方移动的深蓝色正方形就是卷积核。可以看到,整个过程就是一个降维的过程,通过卷积核的不停移动计算,可以提取图像中最有用的特征。我们通常将卷积核计算得到的新的二维矩阵称为特征图,上方动图中,上方不动的青色正方形就是特征图。举例:

      中间滤波器filter与数据窗口做内积,其具体计算过程则是:4*0+0*0+0*0+0*0+0*1+0*1+0*0+0*1+-4*2=-8

“扫”这个操作,代表了卷积运算中的权值共享:

      用一个卷积核作为一个滑块去“扫”一张图片,卷积核里面的数就叫权重,这个特征图每个位置是被同样的卷积核“扫”的,所以权重是一样的,也就是共享。权重共享即一组固定的权重。原理是一个假设:如果一个特征在计算某个空间位置的时候有用,那么它在计算另一个不同位置的时候也有用。

       但是不同的卷积核(滤波器)代表的权重不一样。

卷积需要注意哪些问题?

  1. 步长stride:每次滑动的位置步长。例如,步长为 2 意味着窗口每次移动 2 个单位,即跳过 1 个单位。当卷积核 步长 > 1 时,每次卷积会在时间轴上跳过一些采样点,输出的特征序列就会更短,从而起到降维作用。

  1. 卷积核的个数:决定输出的depth厚度。同时代表卷积核或滤波器的个数。
  2. 填充值zero-padding:每次卷积核移动的时候中间位置都被计算了,而输入图像二维矩阵的边缘却只计算了一次,会不会导致计算的结果不准确呢?如果每次计算的时候,边缘只被计算一次,而中间被多次计算,那么得到的特征图也会丢失边缘特征,最终会导致特征提取不准确,那为了解决这个问题,我们可以在原始的输入图像的二维矩阵周围再拓展一圈或者几圈,这样每个位置都可以被公平的计算到了,也就不会丢失任何特征,这种通过拓展解决特征丢失的方法又被称为Padding。还有一个原因:为了总长能被步长整除

例如Padding取值为1,拓展一圈

Padding取值为2,拓展两圈

四 CNN卷积的整体计算过程

      与常规神经网络不同,卷积神经网络的各层中的神经元是3维排列的:宽度、高度和深度

  1. 对于输入层来说,宽度和高度指的是输入图像的宽度和高度,深度代表输入图像的通道数,例如,对于RGB图像有R、G、B三个通道,深度为3;而对于灰度图像只有一个通道,深度为1。
  2. 对于中间层来说,宽度和高度指的是特征图(feature map)的宽和高,通常由卷积运算和池化操作的相关参数决定;深度指的是特征图的通道数,通常由卷积核的个数决定(不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓,如果想提取图像的不同特征,则用不同的滤波器filte)。全连接神经网络中的主要运算为矩阵相乘,而卷积神经网络中主要为卷积计算。

      在CNN中,滤波器filter对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。

对于上图左侧而言:

      输入块的体积大小为32x32x3,有32x32x3个数字。步长决定滑动多少步可以到边缘。填充值 在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑到末尾位置。

对于上图右侧而言:

      深度depth:神经元个数,决定输出的depth厚度,同时代表滤波器个数「上图意味着便是5个神经元/滤波器,且这5个神经元/滤波器有着相同的感受野——即接受的窗口视野,但它们的权重不同,即共享相同的感受野,但不共享权重。(神经元感受野的范围越大表示其能接触到的原始图像范围就越大,也意味着它能学习更为全局,语义层次更高的特征信息;相反,范围越小则表示其所包含的特征越趋向局部和细节。)

      具体举例:

  1. 左边部分,是输入「7*7*3中,7*7代表图像的像素/长宽,3为深度——代表R、G、B三个颜色通道」,且数据窗口每次移动两个步长取3*3的局部数据,即步长stride=2,另zero-padding=1
  2. 中间部分,是两个不同的滤波器Filter w0、Filter w1,对应于两个神经元,即depth=2
  3. 最右部分,则是两个不同的输出

五 卷积神经网络的构造

1.输入层

      输入层的作用就是将图像转换为其对应的由像素值构成的二维矩阵,并将此二维矩阵存储,等待后面几层的操作。

  1. 去中心化,将样本中心值作为原点,具体实现为将样本值除以样本均值.
  2. 归一化,将样本坐标幅度缩减到0-1之间,降低样本差异带来的干扰。
  3. PCA降维,将高维数据投影到低维上,保留主要特征,降低数据复杂度。

2.卷积层

      通过卷积运算提取输入数据的局部特征。卷积层中的每个卷积核可以提取一种特定的特征,多个卷积核可以并行工作以提取不同类型的特征。

3.激活层

      完成卷积操作后,会得到一个新的特征图,但这个特征图的数值仅仅是线性组合的结果,表达能力有限。此时,激活函数就会被应用到特征图的每个元素上,引入非线性因素。

4.池化层

      当特征图非常多的时候,意味着我们得到的特征也非常多,但是这么多特征都是我们所需要的么?显然不是,其实有很多特征我们是不需要的,而这些多余的特征通常会给我们带来如下两个问题:过拟合、维度过高。

      为了解决这个问题,我们可以利用池化层。池化层又称为下采样,也就是说,当我们进行卷积操作后,再将得到的特征图进行特征提取,将其中最具有代表性的特征提取出来,通过减小特征图的大小来减少计算复杂性,可以起到减小过拟合和降低维度的作用。常见的池化操作包括最大池化和平均池化,通过选择池化窗口内的最大值或平均值来实现。这有助于提取最重要的特征。

      例如最大池化或平均池化,将相邻的一小段时间片合并成 1 个值,明显缩短序列长度。

      以最大池化为例:

这里有几个参数需要说明一下:

① kernel_size=2:池化过程使用的正方形尺寸是2×2,如果是在卷积的过程中就说明卷积核的大小是2×2

②stride=2:每次正方形移动两个位置(从左到右,从上到下),这个过程其实和卷积的操作过程一样

③padding=0:这个之前介绍过,如果此值为0,说明没有进行拓展

经过池化后,我们可以提取到更有代表性的特征,同时还减少了不必要的计算,因为现实情况中神经网络非常大,而经过池化层后,就可以明显的提高模型的效率。

所以说,池化层的好处很多,将其优点总结如下:

  1. 在减少参数量的同时,还保留了原图像的原始特征
  2. 有效防止过拟合
  3. 为卷积神经网络带来平移不变性

以上两个优点我们之前已经介绍过了,那什么又是平移不变性呢?可以用我们之前的一个例子,如下图所示:

      可以看到,两张原始图片的位置有所不同,一个是正常的,另一个是人的脑袋稍稍左移了一些,经过卷积操作后,得到各自对应的特征图,这两张特征图也和原始图片的位置相对应,一个眼睛特征的位置是正常的,另一个眼睛特征的位置稍稍左移了一些,虽然人可以分辨,但是经过神经网络计算后,就可能带来误差,因为应该出现眼睛的位置并没有出现眼睛,那应该怎么办呢?此时使用池化层进行池化操作,可以发现,虽然池化之前两幅图片的眼睛特征不在一个位置,但是经过池化之后,眼睛特征的位置都是相同的,这就为后续神经网络的计算带来了方便,此性质就是池化的平移不变性。

5.多层堆叠

      CNN通常由多个卷积和池化层的堆叠组成,以逐渐提取更高级别的特征。深层次的特征可以表示更复杂的模式。

6.全连接层

      最后,全连接层将提取的特征映射转化为网络的最终输出。这可以是一个分类标签、回归值或其他任务的结果。通常全连接层在卷积神经网络尾部,全连接层和常规神经网络中一样,它的本质其实就是矩阵乘法再加上偏差。

      假设还是上面人的脑袋的示例,现在我们已经通过卷积和池化提取到了这个人的眼睛、鼻子和嘴的特征,如果我想利用这些特征来识别这个图片是否是人的脑袋该怎么办呢?此时我们只需要将提取到的所有特征图进行“展平”,将其维度变为1*x,这个过程就是全连接的过程,也就是说,此步我们将所有的特征都展开并进行运算,最后会得到一个概率值,这个概率值就是输入图片是否是人的概率。

上:展开形式  下:未展开形式

7.输出层

          我们只需要将全连接层得到的一维向量经过计算后得到识别值的一个概率,当然,这个计算可能是线性的,也可能是非线性的。在深度学习中,我们需要识别的结果一般都是多分类的,所以每个位置都会有一个概率值,代表识别为当前值的概率,取最大的概率值,就是最终的识别结果。在训练的过程中,可以通过不断地调整参数值来使识别结果更准确,从而达到最高的模型准确率。

    Logo

    开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

    更多推荐