CNN原理

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

卷积神经网络是一种带有卷积结构的深度神经网络,卷积结构可以减少深层网络占用的内存量。卷积神经网络的结构组成如下图:

其中包含有:

  • 输入层、
  • 卷积层(Convolutional Layer)、
  • 激励层(ReLU layer) 
  • 池化层(下采样层Pooling Layer)、
  • 全连接层(Fully Connected Network)
  • 输出层

  卷积神经网络层、池化层(下采样层)、全连接被合称为隐含层。在卷积神经网络中,卷积神经层与池化层(下采样层)的连接方式是局部连接的形式,即每层的神经元只连接输入层中的跟它相近的几个节点。而全连接层中采用的是全连接的方式,即每一个神经元与输入层中的所有节点连接。

1、输入层


  如果采用经典的神经网络模型,则需要读取整幅图像作为神经网络模型的输入(即全连接的方式),当图像的尺寸越大时,其连接的参数将变得很多,从而导致计算量非常大。而我们人类对外界的认知一般是从局部到全局,先对局部有感知的认识,再逐步对全体有认知,这是人类的认识模式。在图像中的空间联系也是类似,局部范围内的像素之间联系较为紧密,而距离较远的像素则相关性较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。这种模式就是卷积神经网络中降低参数数目的重要神器:局部感受野

  假如:CNN输入层主要是n×m×3 RGB图像,这不同于人工神经网络,人工神经网络的输入是n×1维的矢量。

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

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

去均值与归一化效果图:

    中心化与标准化:在数据挖掘数据处理过程中,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。

  1. 中心化(又叫零均值化):是指变量减去它的均值。其实就是一个平移的过程,平移后所有数据的中心是(0,0)。
  2. 标准化(又叫归一化): 是指数值减去均值,再除以标准差

去相关与白化效果图:

  • PCA是指通过抛弃携带信息量较少的维度,保留主要的特征信息来对数据进行降维处理,思路上是使用少数几个有代表性、互不相关的特征来代替原先的大量的、存在一定相关性的特征,从而加速机器学习进程。 PCA可用于特征提取,数据压缩,去噪声,降维等操作。
  • 白化的目的是去掉数据之间的相关联度和令方差均一化,由于图像中相邻像素之间具有很强的相关性,所以用于训练时很多输入是冗余的。这时候去相关的操作就可以采用白化操作,从而使得:   
  1. 减少特征之间的相关性  
  2. 特征具有相同的方差(协方差阵为1)

2、卷积层


  卷积神经网络里面的这个卷积和信号里面的卷积是有些差别的,信号中的卷积计算分为镜像相乘相加,卷积层中的卷积没有镜像这一操作,直接是相乘和相加,如下图所示:

最左边的是卷积的输入,中间的为卷积核,最右边的为卷积的输出。可以发现卷积计算很简单,就是卷积核与输入对应位置相乘然后求和。除了图中绿颜色的例子,我们可以计算一下图中红色圈对应的卷积结果:(-1)*2+(-1)*9+(-1)*2+1*4+1*4=-5。

如上所述,输入内容为一个 5 X 5 的像素值数组。现在,解释卷积层的最佳方法是想象有一束手电筒光正从图像的左上角照过,假设手电筒光可以覆盖 3 x 3 的区域,想象一下手电筒光照过输入图像的所有区域。

  • 在机器学习术语中,这束手电筒被叫做过滤器(filter,有时候也被称为 神经元(neuron)或 核(kernel)),被照过的区域被称为 感受野(receptive field)
  • 过滤器同样也是一个数组(其中的数字被称作权重或参数)。重点在于过滤器的深度必须与输入内容的深度相同(这样才能确保可以进行数学运算)。
  • 现在,以过滤器所处在的第一个位置为例,即图像的左上角。当筛选值在图像上滑动卷积运算时,过滤器中的值会与图像中的原始像素值相乘(又称为计算点积)。现在你得到了一个数字。切记,该数字只是表示过滤器位于图片左上角的情况。我们在输入内容上的每一位置重复该过程。(下一步将是将过滤器右移 1 单元,接着再右移 1 单元,以此类推。)输入内容上的每一特定位置都会产生一个数字。
  • 过滤器滑过所有位置后将得到一个 3 x 3 x 1 的数组,我们称之为激活映射(activation map)特征映射(feature map)

卷积计算的过程,对于整个输入来说,计算结果还取决于两个参数:padding 和 stride

2.1、Padding填白:它是很多地方都会用到的一种操作比如在加密过程中明文不够长就需要加padding来使得明文与密钥长度相同,其意思就是在原有的基础之上增加一些东西是其规模符合后续操作。

  • 以下图为例子,比如有这么一个5*5的图片(一个格子一个像素),我们滑动窗口取2*2,步长取2,那么我们发现还剩下1个像素没法滑完,那怎么办呢?
  • 那我们在原先的矩阵加了一层填充值,使得变成6*6的矩阵,那么窗口就可以刚好把所有像素遍历完。这就是填充值的作用。
  • 在Tensorflow中padding有两种属性
  1. 一种是valid,这种表示不需要padding操作,假设输入大小为n*n,卷积核大小为f*f,此时输出大小为(n-f+1);
  2. 另一种是same,表示输入和输出的大小相同,假设padding的大小为p,此时为了保持输出和输入消息相同p = (f-1)/2,但是此时卷积核要是奇数大小。

2.2、Stride步长:指卷积核在输入上移动时每次移动的距离。如下图:其中按红框来移动的话stride = 1;按蓝色框来移动的话stride = 2。

   下面两行代码是Tensorflow进行卷积计算的代码:

  • tf.nn.conv2d(x, W, stride=[1, 1, 1, 1], padding='SAME')
  • tf.nn.conv2d(x, W, stride=[1, 2, 2, 1], padding='VALID')

  其中:

  • x为输入
  • W为权重
  • stride的原型为strides =[b, h, w, c],其中:
    • b表示在样本上的步长,默认为1表示每个样本都会进行计算;
    • h,w表示高度宽度,即横向和纵向步长
    • c表示通道数,默认为1,表示每个通道都会参与计算。

2.3 对多通道(channels)图片的卷积

  卷积核除了长宽这两个参数之外还有通道数这个参数,首先需要明确的是单个卷积核的通道数要等于图像的通道数,彩色图像,一般都是RGB三个通道(channel)的,因此输入数据的维度一般有三个:(长,宽,通道)。比如一个28×28的RGB图片,维度就是(28,28,3)。对于多个卷积核的情况也不复杂,直接对每个卷积核进行单个卷积核的操作,然后把它们拼在一起就行了。如下图:

  • 我们的输入图片就是X,shape=(8,8,3);
  • 4个filters其实就是第一层神经网络的参数W1,,shape=(3,3,3,4),这个4是指有4个filters;
  • 输出,就是Z1,shape=(6,6,4);

3、激励层 


   前面的图中,再加一个激活函数,给对应的部分标上符号,就是这样的: 

 激励层的主要作用是将卷积层的结果做非线性映射。常见的激励层函数有sigmoid、tanh、Relu、Leaky Relu、ELU、Maxout。如下图:

  • sigmoid函数是早期用的比较多的激励函数,但现在已经不常用了。主要是当输入特别大或者特别小时,sigmoid函数的偏导数趋于0,这样在使用反向传播算法时将会出现问题,并且sigmoid函数不是关于原点对称的,这样在进行反向传播时w的梯度要么全为正,要么全负(w的梯度即为x乘以上一层的梯度,x恒为正,所以梯度的正负一直不变),收敛速度会非常慢。
  • tanh函数与sigmoid函数图像类似,但是它比sigmoid函数好的一点是tanh函数是关于原点对称的,这样可以减少数据的倾斜。
  • 现在比较常用的激励函数为ReLu(The Rectified Linear Unit/修正线性单元),函数表达式为:f(x)=max(0,x)。ReLu函数的优点是收敛非常快,因为在原点右侧它的偏导数为1,求导简单,这样在做反向传播时速度比较快。缺点时较为脆弱,原点左侧的函数具有的sigmoid相似的问题,即导数等于0。
  • Leaky ReLu在是ReLu的“增强版”,其函数表达式为:f(x)=max(ax,x),a通常为一个比较小的数,比如0.01,上图是a=0.01时的图像,可以看到,相比ReLu,Leaky ReLu在原点左侧的表达式中对x乘以了一个比较小的系数,这样保证了在做反向传播时不会挂掉,并且其计算也很快。
  • ELU指数线性单元:ELU不会挂掉,计算速度比较快,并且输出的均值趋于0,但是由于指数的存在,计算量略大。
  • Maxout:两条直线拼接而成,计算是线性的,比较快,不会饱和不会挂,但是参数比较多。

激励函数使用总结:

  • 尽量不要用sigmoid函数
  • 首选ReLu,速度快,但是需要小心,有可能会挂掉
  • ReLu不行的话再选用Leaky ReLu或者Maxout

4、池化层


池化层(pooling)的作用主要是降低维度,通过对卷积后的结果进行降采样来降低维度,分为最大池化和平均池化两类。

4.1、最大池化

最大池化顾名思义,降采样的时候采用最大值的方式采样,如图所示,其中池化核的大小为2*2,步长也为2*2

4.2、平均池化

平均池化就是用局部的平均值作为采样的值,还是上面的数据,平均池化后的结果为:

示例代码:

  • tf.nn.max_pool(x, ksize=[2, 2, 2, 1], stride=[2, 2, 2, 1], padding='SAME')
  • tf.nn.avg_pool(x, ksize=[2, 2, 2, 1], stride=[2, 2, 2, 1], padding='SAME')

小结:

  • 通常,使用的比较多的是Maxpooling,而且一般取大小为(2,2)步长为2的filter,这样,经过pooling之后,输入的长宽都会缩小2倍,channels不变。

5、全连接层


  在卷积神经网络网络中,至少是有一个全连接层。全连接层位于所有的卷积层之后,层与层之间的神经元采用全连接的方式进行连接。全连接层的主要作用是对卷积层提取出来的特征进一步提取出高层次的特征。它通过将卷积层的特征进行合并或者取样,提取出其中的具有区分性的特征,从而达到分类的目的。全连接层与卷积层的区别第一个是连接方式的不同:

  • 卷积层中采用的是局部连接方式,即一个节点和上一层中的部分节点相连
  • 而全连接层中,该层的每一个神经元与上一层的所有神经进行连接,如下图
  • 连接层中权值是不共享的,每一条线都代表了一个权值。而在左边卷积层的连接方式图中,颜色相同的连接,参数相同。我们可以看出相对于卷积层,全连接层的参数更多,所以其网络的复杂度也更大。
  • 在全连接层中,常用softmax 逻辑回归来进行分类识别图像。softmax 逻辑回归分类方法主要用于多分类问题。在构建分类器的过程中,一般还采用正则化方法来防止训练过拟合,提高分类的性能

链全连接层在整个卷积神经网络中起到“分类器”的作用,即通过卷积、激活函数、池化等深度网络后,再经过全连接层对结果进行识别分类。首先将经过卷积、激活函数、池化的深度网络后的结果串起来,如下图所示:

接下来,随便看一个CNN的模样,来获取对CNN的一些感性认识:

  • 结构可以用:X-->CONV(relu)-->MAXPOOL-->CONV(relu)-->FC(relu)-->FC(softmax)-->Y 来表示。

  • 在经过数次卷积和池化之后,我们 最后会先将多维的数据进行“扁平化”,也就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了。

6、小结


6.1、参数共享机制(parameters sharing)

   假设图像是8×8大小,也就是64个像素,假设我们用一个有9个单元的全连接层,那这一层我们需要多少个参数呢?需要 64×9 = 576个参数(先不考虑偏置项b)。因为每一个链接都需要一个权重w。那我们看看 同样有9个单元的filter是怎么样的:

  不用看就知道,有几个单元就几个参数,所以总共就9个参数!因为,对于不同的区域,我们都共享同一个filter,因此就共享这同一组参数。这也是有道理的,filter是用来检测特征的,那一个特征一般情况下很可能在不止一个地方出现,比如“竖直边界”,就可能在一幅图中多出出现,那么 我们共享同一个filter不仅是合理的,而且是应该这么做的。
  由此可见,参数共享机制,让我们的网络的参数数量大大地减少。这样,我们可以用较少的参数,训练出更加好的模型,典型的事半功倍,而且可以有效地 避免过拟合。同样,由于filter的参数共享,即使图片进行了一定的平移操作,我们照样可以识别出特征,这叫做 “平移不变性”。因此,模型就更加稳健了。

6.2、问题二:卷积核的大小以及卷积核之中的参数是怎么得来的么

  大小的话,常见的是3x3,但为什么是3x3,并没有理论依据,通过大量的实践测试得来的,这个大小最好用。还有一个特殊的是1x1的,一般做降维或者线性变换的时候用。 常见的卷积核如下图:

6.3、BP网络  

  卷积神经网络 (CNN)训练的过程是:信号由输入层输入,经隐含层 ( 至少一层 ) , 最后由输出层输出。 为了使得输出的结果与期望值间的误差最小,我们需要对每层的权重参数进行调整,调成的过程是: 利用输出值与期望值之间的误差, 由输出层经隐含层到输入层, 进行每层的误差计算, 这个过程其实就是反向传播网络 BP(Back Propagation)的计算过程。

  BP(Back Propagation)网络是 1986 年由 Rumelhart 和McCelland 为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络, 是目前应用最广泛的神经网络模型之一。 BP学习网络能学习和存储大量的输入 - 输出模式映射关系,而事前无需揭示这种映射关系的数学方程。 它的学习规则是使用梯度下降法通过反向传播不断调整网络的权重和阈值使网络的误差平方和最小。详细推导过程,参见:https://wenku.baidu.com/view/01f86babf9c75fbfc77da26925c52cc58ad69078.html

6.4、如何利用CNN实现图像识别的任务

  1. 输入层读入经过规则化(统一大小)的图像,每一层的每个神经元将前一层的一组小的局部近邻的单元作为输入也就是局部感受野权值共享,神经元抽取一些基本的视觉特征,比如边缘、角点等,这些特征之后会被更高层的神经元所使用。
  2. 卷积神经网络通过卷积操作获得特征图,每个位置,来自不同特征图的单元得到各自不同类型的特征。一个卷积层中通常包含多个具有不同权值向量的特征图,使得能够保留图像更丰富的特征。
  3. 卷积层后边会连接池化层进行降采样操作,一方面可以降低图像的分辨率,减少参数量,另一方面可以获得平移和形变的鲁棒性。
  4. 卷积层和池化层的交替分布,使得特征图的数目逐步增多,而且分辨率逐渐降低,是一个双金字塔结构。

6.5、CNN的特征

  1. 具有一些传统技术所没有的优点:良好的容错能力、并行处理能力和自学习能力。可处理环境信息复杂,背景知识不清楚,推理规则不明确情况下的问题,允许样品有较大的缺损、畸变,运行速度快,自适应性能好,具有较高的分辨率。它是通过结构重组和减少权值将特征抽取功能融合进多层感知器,省略识别前复杂的图像特征抽取过程。
  2. 泛化能力要显著优于其它方法,卷积神经网络已被应用于模式分类,物体检测和物体识别等方面。利用卷积神经网络建立模式分类器,将卷积神经网络作为通用的模式分类器,直接用于灰度图像。
  3. 是一个前溃式神经网络,能从一个二维图像中提取其拓扑结构,采用反向传播算法来优化网络结构,求解网络中的未知参数。
  4. CNN被认为是第一个真正成功的采用多层层次结构网络的具有鲁棒性的深度学习方法。CNN通过挖掘数据中的空间上的相关性,来减少网络中的可训练参数的数量,达到改进前向传播网络的反向传播算法效率,因为CNN需要非常少的数据预处理工作,所以也被认为是一种深度学习的方法。在CNN中,图像中的小块区域(也叫做“局部感知区域”)被当做层次结构中的底层的输入数据,信息通过前向传播经过网络中的各个层,在每一层中都由过滤器构成,以便能够获得观测数据的一些显著特征。因为局部感知区域能够获得一些基础的特征,比如图像中的边界和角落等,这种方法能够提供一定程度对位移、拉伸和旋转的相对不变性。
  5. CNN中层次之间的紧密联系和空间信息使得其特别适用于图像的处理和理解,并且能够自动的从图像抽取出丰富的相关特性。
  6. CNN通过结合局部感知区域、共享权重、空间或者时间上的降采样来充分利用数据本身包含的局部性等特征,优化网络结构,并且保证一定程度上的位移和变形的不变性。
  7. CNN是一种深度的监督学习下的机器学习模型,具有极强的适应性,善于挖掘数据局部特征,提取全局训练特征和分类,它的权值共享结构网络使之更类似于生物神经网络,在模式识别各个领域都取得了很好的成果。
  8. CNN可以用来识别位移、缩放及其它形式扭曲不变性的二维或三维图像。CNN的特征提取层参数是通过训练数据学习得到的,所以其避免了人工特征提取,而是从训练数据中进行学习;其次同一特征图的神经元共享权值,减少了网络参数,这也是卷积网络相对于全连接网络的一大优势。共享局部权值这一特殊结构更接近于真实的生物神经网络使CNN在图像处理、语音识别领域有着独特的优越性,另一方面权值共享同时降低了网络的复杂性,且多维输入信号(语音、图像)可以直接输入网络的特点避免了特征提取和分类过程中数据重排的过程。
  9. CNN的分类模型与传统模型的不同点在于其可以直接将一幅二维图像输入模型中,接着在输出端即给出分类结果。其优势在于不需复杂的预处理,将特征抽取,模式分类完全放入一个黑匣子中,通过不断的优化来获得网络所需参数,在输出层给出所需分类,网络核心就是网络的结构设计与网络的求解。这种求解结构比以往多种算法性能更高。
  10. 隐层的参数个数和隐层的神经元个数无关,只和滤波器的大小和滤波器种类的多少有关。隐层的神经元个数,它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关。

6.6 、卷积神经网络之典型CNN

  • LeNet,这是最早用于数字识别的CNN
  • AlexNet, 2012 ILSVRC比赛远超第2名的CNN,比LeNet更深,用多层小卷积层叠加替换单大卷积层。
  • ZF Net, 2013 ILSVRC比赛冠军
  • GoogLeNet, 2014 ILSVRC比赛冠军
  • VGGNet, 2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet,但是在很多图像转化学习问题(比如object detection)上效果奇好

    

参考资料


原文地址:https://www.cnblogs.com/tgzhu/p/11341821.html