卷积神经网络
卷积神经网络,是一种前馈神经网络,人工神经元可以响应周围单元,可以进行大型图像处理。卷积神经网络包括卷积层和池化层。
首先来看上一篇文章中的图,这个图就是用来描述CNN
从入坑开始 —— CNN
或许这并不是你接触到的第一个深度学习领域、或者是机器学习领域的专业名词,但是搞明白它,足以让我们学习到很多知识以供后续的学习和进步。
CNN(Convolutional Neural Networks)也就是我们常说的卷积神经网络,单单从这个名词来看,这里就有几个概念需要我们来弄明白——什么是卷积,什么是神经网络。
卷积
最早接触这个词的时候是读大学的时候学习《数字信号处理》这门课程,里面在FFT快速傅里叶变化的时候有讲到卷积运算,$\bigotimes$ 表示卷积运算,那么:
离散化的卷积运算:
但是!!!这里神经网络中的卷积运算,并非傅里叶变换中的卷积运算,这里的卷积运算是以图像和卷积核(也叫滤波器)对应位置相乘再相加得到的结果:如下图所示:
图中的黄色区域的标注数字为卷积核,如下所示:
我们可以看到,右边得到的结果是左边大矩阵和小矩阵卷积得到的,大矩阵就是我们的原图像,里面的值就是图像像素的值,而小矩阵就是卷积核。两者对应位置相乘然后依次相加,得到新矩阵的一个位置的值,然后向右滑动卷积核(滑动的间隔可调)得到新的位置的值。这就是神经网络中的卷积。这里要注意的是,我们从上图中可以看到,卷积核在移动的过程中是一个一个像素滑动的,这个滑动的间隔叫做步长(strides),strides的值可以自己设置,表示滑动的间隔的大小。通过这样的操作,我们可以直观的看到,原图像尺寸被卷积操作缩小了。这就是卷积操作的作用,可以通过卷积核把一个小区间内的特征提取出来,并以数值化的形式表现出来。如果你要深挖为什么要用这样的计算形式来处理卷积核与图形,建议看图像滤波方面的内容。
那么到这里,我们初步具备了学习卷积神经网络的基础知识。Next,我们开始了解卷积神经网络中的各层,以及它们的工作内容。
卷积神经网络中的分层
卷积神经网络,是一种前馈神经网络,卷积神经网络包括卷积层和池化层。
输入层(Input Layer)
输入层:
该层要做的处理主要是对原始图像数据进行预处理,其中包括:
- 去均值:
把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。 - 归一化:
幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。 - PCA/白化:
用PCA降维;白化是对数据各个特征轴上的幅度归一化
卷积层(Convention Layer)
卷积神经网络(CNN)第一次提出是在1997年,杨乐春(LeNet)大神的一篇关于数字OCR识别的论文,在2012年的ImageNet竞赛中CNN网络成功击败其它非DNN模型算法,从此获得学术界的关注与工业界的兴趣。从本质上来说,图像卷积都是离散卷积,离散卷积本质上是线性变换、(这也是为什么要引入激活函数)上面已经介绍了离散卷积运算的形式,卷积层也是卷积神经网络中最重要的一个层:
卷积在上文,以及之前的文章中我们介绍过它的运算方式,实际卷积的过程或者说卷积运算的过程,就是在提取原矩阵中的特征,(或者理解为对原矩阵做滤波)所以每次卷积操作完成后,得到的都是一个featuremap
下面的图片详细解释了卷积的过程:
上面这个图中有几个重要的名词,我们需要了解:
- 深度/depth(就是每次卷积能得到多少个featuremap)
- 步长/stride (窗口一次滑动的长度)
- 填充值/zero-padding(边缘填充0)VALID(边缘不填充)
上面就是单层卷积操作的全部过程了,对于多层卷积我们以一个例子来说明:
比如上图中输入为5x5x2,卷积核为3个3x3的filter,填充方式为VALID,那么这幅图从下往上看,我们第一步分别用三个卷积核对原图像做卷积得到第二层的3个3x3x2的结果,然后对于每一个3x3x2的结果,两层featuremap的对应位置相加,就得到一张3x3的featuremap,同样其他卷积核得到的结果相同,这样就一共得到了三张featuremap,所以说最后输出的featuremap数量与卷积核的数量相同。
池化层(Sampling Layer,Pooling Layer)
不知道为什么使用‘池化’这个词,实际这个过程更符合“采样”,我的猜测是“采样”更多的体现的是从已有样本中选择出代表,而池化是使用某些运算后的结果作为代表,并不一定是在原样本中采样。
在CNN网络中卷积池之后会跟上一个池化层,池化层的作用是提取局部均值与最大值,根据计算出来的值不一样就分为均值池化层与最大值池化层,一般常见的多为最大值池化层。池化的时候同样需要提供filter的大小、步长。
全连接(Full-Connection Layer)
上图的最后两层小圆圈就是全连接层,全连接层的作用就是将前面的二维数据输出成一维数据!
啊~终于快结束了~学到这里脑子已经感觉有些木了。别急马上结束~
看到上面这个图,我的第一反应是,它是如何把20x12x12变成100x1x1的?这里我们套用网上的一个例子:
这个过程可以理解为在中间做了一个卷积,但是这里的卷积核与前面的输出层图像维度相同,都是5层,每层的滤波器都是相同的,但是我们有4096个卷积核。
从上图我们可以看出,我们用一个3x3x5的filter 去卷积激活函数的输出,得到的结果就是一个fully connected layer 的一个神经元的输出,这个输出就是一个值
因为我们有4096个神经元
我们实际就是用一个3x3x5x4096的卷积层去卷积激活函数的输出。
“这一步卷积一个非常重要的作用就是把分布式特征representation映射到样本标记空间”—知乎:蒋竺波
例子:
目标是检查图片中有没有猫,而不关心猫的位置。
到这里我们明白了一点:卷积层就是在提取特征,全连接层就是在分类,全连接层中的没个数值就是判断前面的卷积层有没有提取到目标的某个特征的依据。比如全连接层输出为[1,0,1,1];则表示,除了第二个特征,其余的特征都检测到了。
红色的神经元表示特征被找到。(激活了)
最终的输出形式:
那么全连接层对模型影响参数就是三个:
全接解层的总层数(长度)
单个全连接层的神经元数(宽度)
激活函数
输出层(Output Layer)
……
有了上面对卷积神经网络的了解,我们要继续了解一下其他内容,下面的前馈网络和BP网络都是对网络中权值更新的算法。
前馈神经网络
现在讲的都是前馈网络,后来人们发现权值更新使用了BP思想以后,才有了BP神经网络这个名词。
BP神经网络
首先不要认为BP网络与卷积网络是并列关系,两者专注的领域不同,BP网络的目的是使用反向传递的思想来更新权值,而卷积网络的目的是降低网络中神经元的连接数量从而减少权值的计算。
其他卷积神经网络
- LeNet,这是最早用于数字识别的CNN
- AlexNet, 2012 ILSVRC比赛远超第2名的CNN,比
- LeNet更深,用多层小卷积层叠加替换单大卷积层。
- ZF Net, 2013 ILSVRC比赛冠军
- GoogLeNet, 2014 ILSVRC比赛冠军
- VGGNet, 2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet,但是在很多图像转化学习问题(比如object detection)上效果奇好
深度学习
卷积神经网络的常用框架
- Caffe
- 源于Berkeley的主流CV工具包,支持C++,python,matlab
- Model Zoo中有大量预训练好的模型供使用
- Torch
- Facebook用的卷积神经网络工具包
- 通过时域卷积的本地接口,使用非常直观
- 定义新网络层简单
- TensorFlow
- Google的深度学习框架
- TensorBoard可视化很方便
- 数据和模型并行化好,速度快