• 卷积神经网络CNN


    一、简介

      卷积神经网络是近年发展起来的,并引起广泛重视的一种高效识别方法,20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络(Convolutional Neural Networks-简称CNN)。现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。 K.Fukushima在1980年提出的新识别机是卷积神经网络的第一个实现网络。随后,更多的科研工作者对该网络进行了改进。其中,具有代表性的研究成果是Alexander和Taylor提出的“改进认知机”,该方法综合了各种改进方法的优点并避免了耗时的误差反向传播。

      一般的,CNN的基本结构包括两层,其一为特征提取层,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其它特征间的位置关系也随之确定下来;其二是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数。卷积神经网络中的每一个卷积层都紧跟着一个用来求局部平均与二次提取的计算层,这种特有的两次特征提取结构减小了特征分辨率。

      CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形,该部分功能主要由池化层实现。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

    二、CNN卷积神经网络

      1、CNN的主要概述

      卷积层的神经元只与前一层的部分神经元节点相连,即它的神经元间的连接是非全连接的,且同一层中某些神经元之间的连接的权重w和偏置b是共享的(即相同的)大量地减少了需要训练参数的数量。

      CNN主要特点:减少权值,局部连接,权值共享

      CNN通过感受野和权值共享减少了神经网络需要训练的参数的个数。

      2、CNN的一般结构

    • 输入层:用于数据的输入
    • 卷积层:使用卷积核进行特征提取和特征映射
    • 激励层:由于卷积也是一种线性运算,因此需要增加非线性映射
    • 池化层:压缩数据和参数的量,减小过拟合。
    • 全连接层:通常在CNN的尾部进行重新拟合,减少特征信息的损失
    • 输出层:用于输出结果

      (1)数据输入层

      该层要做的处理主要是对原始图像数据进行预处理,其中包括:

    • 去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。
    • 归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。
    • PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化

      去均值与归一化效果图:

     

    去相关与白化效果图:



      (2)卷积计算层

    这一层就是卷积神经网络最重要的一个层次,也是“卷积神经网络”的名字来源。
    在这个卷积层,有两个关键操作:

    • 局部关联。每个神经元看做一个滤波器(filter)
    • 窗口(receptive field)滑动, filter对局部数据计算

      (2.1)名词和概念

      先介绍卷积层的几个名词和概念:

    • 感受视野( local receptive fields)

        即感受上一层的部分特征。在卷积神经网络中,隐藏层中的神经元的感受视野比较小,只能看到上一次的部分特征,上一层的其他特征可以通过平移感受视野来得到同一层的其他神经元。

    • 卷积核

        感受视野中的权重矩阵。

    • 共享权值(shared weights) 

      详见(2.3)参数共享机制解释。

    • 深度/depth(解释见下图)
     
    • 步长(stride)

        感受视野对输入的扫描间隔称为步长(stride),即窗口一次滑动的长度

    • 边界扩充(pad)

         当步长比较大时(stride>1),为了扫描到边缘的一些特征,感受视野可能会“出界”,这时需要对边界扩充(pad)。以下图为例子,比如有这么一个5 * 5的图片(一个格子一个像素),我们滑动窗口取2*2,步长取2,那么我们发现还剩下1个像素没法滑完,那怎么办呢? 

     

    那我们在原先的矩阵加了一层填充值,使得变成6*6的矩阵,那么窗口就可以刚好把所有像素遍历完。这就是填充值(边界扩充)的作用。 

    • 特征映射图(feature map)

         通过一个带有卷积核的感受视野 扫描生成的下一层神经元矩阵 称为一个特征映射图(feature map)

      (2.2)卷积的计算

    接下来讲卷积的计算(注意,下面蓝色矩阵周围有一圈灰色的框,那些就是上面所说到的填充值)

     
     

      这里的蓝色矩阵就是输入的图像,粉色矩阵就是卷积层的神经元,这里表示了有两个神经元(w0,w1)。绿色矩阵就是经过卷积运算后的输出矩阵,这里的步长设置为2。
     
     

     

      蓝色的矩阵(输入图像)对粉色的矩阵(filter)进行矩阵内积计算并将三个内积运算的结果与偏置值b相加(比如上面图的计算:2+(-2+1-2)+(1-2-2) + 1= 2 - 3 - 3 + 1 = -3),计算后的值就是绿框矩阵的一个元素。


     
     

      下面的动态图形象地展示了卷积层的计算过程:


     
     

      (2.3)参数共享机制解释

    • 在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。
    • 需要估算的权重个数减少: AlexNet 1亿 => 3.5w
    • 一组固定的权重和不同窗口内数据做内积: 卷积

      (3)激励层

      激励层主要对卷积层的输出进行一个非线性映射,因为卷积层的计算还是一种线性计算。使用的激励函数一般为ReLu函数。

      卷积层和激励层通常合并在一起称为“卷积层”。

     

      CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱,图像如下。


     
     


      (4)池化层

      池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。当输入经过卷积层时,若感受视野比较小,布长stride比较小,得到的feature map(特征映射图)还是比较大,可以通过池化层来对每一个feature map进行降维操作,输出的深度还是不变的,依然为feature map的个数。

      这里再展开叙述池化层的具体作用:

      1)特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。

      2)特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。

      3)在一定程度上防止过拟合,更方便优化。

     
     

    池化层也有一个“池化视野(filter)”来对feature map矩阵进行扫描,对“池化视野”中的矩阵值进行计算,一般有两种计算方式:

       (1)Max pooling:取“池化视野”矩阵中的最大值

       (2)Average pooling:取“池化视野”矩阵中的平均值

      (5)全连接层和输出层

    全连接层主要对特征进行重新拟合,减少特征信息的丢失。输出层主要准备做好最后目标结果的输出。

    两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:

     

    三、卷积神经网络 VS. 传统神经网络

      其实现在回过头来看,CNN跟我们之前学习的神经网络,也没有很大的差别。传统的神经网络,其实就是多个FC层叠加起来。CNN,无非就是把FC改成了CONV和POOL,就是把传统的由一个个神经元组成的layer,变成了由filters组成的layer。那么,为什么要这样变?有什么好处?具体说来有两点:

      1.参数共享机制(parameters sharing)
      我们对比一下传统神经网络的层和由filters构成的CONV层:
      假设我们的图像是8×8大小,也就是64个像素,假设我们用一个有9个单元的全连接层:

     
    使用全连接

      那这一层我们需要多少个参数呢?需要 64×9 = 576个参数(先不考虑偏置项b)。因为每一个链接都需要一个权重w。

      那我们看看 同样有9个单元的filter是怎么样的:

     
    使用filter

      其实不用看就知道,有几个单元就几个参数,所以总共就9个参数

      因为,对于不同的区域,我们都共享同一个filter,因此就共享这同一组参数。
    这也是有道理的,通过前面的讲解我们知道,filter是用来检测特征的,那一个特征一般情况下很可能在不止一个地方出现,比如“竖直边界”,就可能在一幅图中多出出现,那么 我们共享同一个filter不仅是合理的,而且是应该这么做的。

      由此可见,参数共享机制,让我们的网络的参数数量大大地减少。这样,我们可以用较少的参数,训练出更加好的模型,典型的事半功倍,而且可以有效地 避免过拟合
      同样,由于filter的参数共享,即使图片进行了一定的平移操作,我们照样可以识别出特征,这叫做 “平移不变性”。因此,模型就更加稳健了。

      2.连接的稀疏性(sparsity of connections)
      由卷积的操作可知,输出图像中的任何一个单元,只跟输入图像的一部分有关系:

     
    只跟输入的一部分有关

      而传统神经网络中,由于都是全连接,所以输出的任何一个单元,都要受输入的所有的单元的影响。这样无形中会对图像的识别效果大打折扣。比较,每一个区域都有自己的专属特征,我们不希望它受到其他区域的影响。

    正是由于上面这两大优势,使得CNN超越了传统的NN,开启了神经网络的新时代。

    四、CNN的有点和缺点

      优点:

        1、共享卷积核,对高维数据处理无压力

        2、可以自动进行特征提取:卷积层可以提取特征, 卷积层中的卷积核(滤波器)真正发挥作用,通过卷积提取需要的特征。 

      缺点:

        1、需要调参,需要大样本量,训练最好要GPU。

        2、卷积神经网络没有记忆功能。

        3、对图像处理很友善,对视频语音自然语言处理能力差

        4、池化层会丢失大量有价值信息,忽略局部与整体之间关联性;

        5、由于特征提取的封装,为网络性能的改进罩了一层黑盒。也就说,我们并不知道没个卷积层到底提取到的是什么特征,而且神经网络本身就是一种难以解释的“黑箱模型”。 

    五、CNN卷积神经网络的应用

    1、目标分类 

    2、目标检测(目标定位、人脸检测、人形检测、车辆检测) 

        (R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、YOLO V2、YOLO V3)

    3、目标识别(人脸识别、人形识别)  人脸识别算法演化史    (DeepFace、FaceNet、DeepID)

    4、目标跟踪

    5、目标分割

    6、关键点检测 

    六、常见的CNN卷积神经网络

    • 卷积神经⽹络(LeNet)
    • 深度卷积神经⽹络(AlexNet)
    • 使⽤重复元素的⽹络(VGG)
    • ⽹络中的⽹络(NiN)
    • 含并⾏连结的⽹络(GoogLeNet)
    • 残差⽹络(ResNet)
    • 稠密连接⽹络(DenseNet) 

    七、总结

      卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。

      CNN一个非常重要的特点就是头重脚轻(越往输入权值越小,越往输出权值越多),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。

      卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

    参考:

    https://www.cnblogs.com/wj-1314/p/9754072.html

    https://www.jianshu.com/p/c0215d26d20a

    https://blog.csdn.net/asialee_bird/article/details/80459163

  • 相关阅读:
    3.4、Python中的类详解(0601)
    3.3、Python函数详解(0601)
    3.2、Python函数详解(0601)
    3.1、Python中的正则表达式(0601)
    2.4、Python文件对象及os、os.path和pickle模块(0530)
    2.3、Python迭代器、列表解析及生成器(0530)
    2.2、Python程序控制结构(0530)
    PHP之pear包总结
    Mac之brew使用
    Node之安装篇
  • 原文地址:https://www.cnblogs.com/liuxiaochong/p/13463723.html
Copyright © 2020-2023  润新知