卷积神经网络CNN总结

从神经网络到卷积神经网络(CNN)
咱们知道神经网络的结构是这样的:
python

那卷积神经网络跟它是什么关系呢?
其实卷积神经网络依旧是层级网络,只是层的功能和形式作了变化,能够说是传统神经网络的一个改进。好比下图中就多了许多传统神经网络没有的层次。算法

 


卷积神经网络的层级结构
      • 数据输入层/ Input layer
  • 卷积计算层/ CONV layer
  • ReLU激励层 / ReLU layer
  • 池化层 / Pooling layer
  • 全链接层 / FC layer网络

 

1.数据输入层
该层要作的处理主要是对原始图像数据进行预处理,其中包括:
  • 去均值:把输入数据各个维度都中心化为0,以下图所示,其目的就是把样本的中心拉回到坐标系原点上。
  • 归一化:幅度归一化到一样的范围,以下所示,即减小各维度数据取值范围的差别而带来的干扰,好比,咱们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,若是直接使用这两个特征是有问题的,好的作法就是归一化,即A和B的数据都变为0到1的范围。
  • PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化框架

 

去均值与归一化效果图:
机器学习

 

去相关与白化效果图:
ide

 

 

2.卷积计算层
这一层就是卷积神经网络最重要的一个层次,也是“卷积神经网络”的名字来源。
在这个卷积层,有两个关键操做:
  • 局部关联。每一个神经元看作一个滤波器(filter)
  • 窗口(receptive field)滑动, filter对局部数据计算函数

 

先介绍卷积层遇到的几个名词:
  • 深度/depth(解释见下图)
  • 步长/stride (窗口一次滑动的长度)
  • 填充值/zero-padding
工具

 

填充值是什么呢?如下图为例子,好比有这么一个5*5的图片(一个格子一个像素),咱们滑动窗口取2*2,步长取2,那么咱们发现还剩下1个像素无法滑完,那怎么办呢?



那咱们在原先的矩阵加了一层填充值,使得变成6*6的矩阵,那么窗口就能够恰好把全部像素遍历完。这就是填充值的做用。



布局

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


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

 

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

 

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

 


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

 


3.激励层
把卷积层输出结果作非线性映射。

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

 

激励层的实践经验:
  ①不要用sigmoid!不要用sigmoid!不要用sigmoid!
  ② 首先试RELU,由于快,但要当心点
  ③ 若是2失效,请用Leaky ReLU或者Maxout
  ④ 某些状况下tanh却是有不错的结果,可是不多


4.池化层
池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减少过拟合。
简而言之,若是输入是图像的话,那么池化层的最主要做用就是压缩图像。

 

这里再展开叙述池化层的具体做用。

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

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

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


池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。

这里就说一下Max pooling,其实思想很是简单。

对于每一个2*2的窗口选出最大的数做为输出矩阵的相应元素的值,好比输入矩阵第一个2*2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,如此类推。


5.全链接层
两层之间全部神经元都有权重链接,一般全链接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的链接方式是同样的:


通常CNN结构依次为
  1. INPUT
  2. [[CONV -> RELU]*N -> POOL?]*M
  3. [FC -> RELU]*K
  4. FC


卷积神经网络之训练算法
  1. 同通常机器学习算法,先定义Loss function,衡量和实际结果之间差距。
  2. 找到最小化损失函数的W和b, CNN中用的算法是SGD(随机梯度降低)。


卷积神经网络之优缺点
优势
  • 共享卷积核,对高维数据处理无压力
  • 无需手动选取特征,训练好权重,即得特征分类效果好
缺点
  • 须要调参,须要大样本量,训练最好要GPU
  • 物理含义不明确(也就说,咱们并不知道没个卷积层到底提取到的是什么特征,并且神经网络自己就是一种难以解释的“黑箱模型”)


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


卷积神经网络之 fine-tuning
何谓fine-tuning?
fine-tuning就是使用已用于其余目标、预训练好模型的权重或者部分权重,做为初始值开始训练。

那为何咱们不用随机选取选几个数做为权重初始值?缘由很简单,第一,本身从头训练卷积神经网络容易出现问题;第二,fine-tuning能很快收敛到一个较理想的状态,省时又省心。

那fine-tuning的具体作法是?
  • 复用相同层的权重,新定义层取随机权重初始值
  • 调大新定义层的的学习率,调小复用层学习率


卷积神经网络的经常使用框架

Caffe
  • 源于Berkeley的主流CV工具包,支持C++,python,matlab
  • Model Zoo中有大量预训练好的模型供使用
Torch
  • Facebook用的卷积神经网络工具包
  • 经过时域卷积的本地接口,使用很是直观
  • 定义新网络层简单
TensorFlow
  • Google的深度学习框架
  • TensorBoard可视化很方便
  • 数据和模型并行化好,速度快

 

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

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

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

 


如下是我本身在学习CNN的时候遇到的一些困惑,以及查阅一些资料后获得的一些答案。

第一个问题:为何不用BP神经网络去作呢?
1.全链接,权值太多,须要不少样本去训练,计算困难
  • 应对之道:减小权值的尝试,局部链接,权值共享

  卷积神经网络有两种神器能够下降参数数目。
  第一种神器叫作局部感知野,通常认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。于是,每一个神经元其实没有必要对全局图像进行感知,只须要对局部进行感知,而后在更高层将局部的信息综合起来就获得了全局的信息。
  第二级神器,即权值共享。

 


2.边缘过渡不平滑
  • 应对之道:采样窗口彼此重叠

 


第二个问题:LeNet里的隐层的神经元个数怎么肯定呢?
它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关!

LeNet-5共有7层,不包含输入,每层都包含可训练参数(链接权重)。输入图像为32*32大小。

例如,个人图像是1000x1000像素,而滤波器大小是10x10,假设滤波器没有重叠,也就是步长为10,这样隐层的神经元个数就是(1000x1000 )/ (10x10)=100x100个神经元了。

那重叠了怎么算?好比上面图的C2中28*28是如何得来的?这里的步长就是1,窗口大小是5*5,因此窗口滑动确定发生了重叠。下图解释了28的由来。

 

 

第三个问题:S2层是一个下采样层是干吗用的?为何是下采样?也就是上面所说的池化层,只是叫法不一样而已。这层利用图像局部相关性的原理,对图像进行子抽样,能够减小数据处理量同时保留有用信息,至关于图像压缩。