CNN卷积神经网络-学习记录
CNN介绍
为了“教会”一种算法如何识别图像中的对象,我们使用特定类型的人工神经网络:卷积神经网络(Convolutional Neural Network)简称CNN。他们的名字源于网络中最重要的一个操作:卷积。CNN的概念图如下:
CNN架构简单来说就是:图片经过各两次的Convolution, Pooling, Fully Connected就是CNN的架构了,因此只要搞懂Convolution, Pooling, Fully Connected三个部分的内容就可以完全掌握了CNN。
CNN结构
1. Input layer(数据输入层)
该层要做的处理主要是对原始图像数据进行预处理,其中包括:
- 去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。
- 归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。
- PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化
2. Convolutional layer(卷积层–CONV)
这一层是卷积神经网络最重要的一个层次,有两个关键操作:
- 局部关联。每个神经元看做一个滤波器(filter)
- 窗口(receptive field)滑动, filter对局部数据计算
卷积层名词:
- 深度/depth(有多少神经元,深度就是多少)
- 步长/stride (窗口一次滑动的长度)
- 步长大小通常为1,意味着滤镜逐个像素地滑动。通过增加步幅大小,滤波器在输入上滑动的间隔更大,因此单元之间的重叠更少。
- 填充值/zero-padding
2.1 卷积运算
卷积运算就是将原始图片的与特定的Feature Detector(filter)做卷积运算(符号⊗),卷积运算就是将下图两个3x3的矩阵作相乘后再相加,以下图为例0 * 0 + 0 * 0 + 0 * 1+ 0 * 1 + 1 * 0 + 0 * 0 + 0 * 0 + 0 * 1 + 0 * 1 = 0。
中间的Feature Detector(Filter)会随机产生好几种(ex:16种),Feature Detector的目的就是帮助我们萃取出图片当中的一些特征(ex:形状),就像人的大脑在判断这个图片是什么东西也是根据形状来推测。
动图过程:
我们在输入上进行了多次卷积,其中每个操作使用不同的过滤器。这导致不同的特征映射。最后,我们将所有这些特征图放在一起,作为卷积层的最终输出。
2.2 填白padding
从上面的例子中,我们可以知道,原图像在经过filter卷积之后变小了,从(5, 5)变成了(3, 3)。假设我们再卷一次,那大小就变成了(1, 1)了。
所以这里主要有两个问题:
- 每次卷积,图像都缩小,这样卷不了几次就没了;
- 相比于图片中间的点,图片边缘的点在卷积中被计算的次数很少。这样的话,边缘的信息就易于丢失。
为了解决这个问题,我们可以采用padding的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。
比如,我们把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,就是(8,8),没有变。
我们把上面这种“让卷积之后的大小不变”的padding方式,称为**“Same”方式,
把不经过任何填白的,称为“Valid”**方式。这个是我们在使用一些框架的时候,需要设置的超参数。
还有一种情况,对于一个5x5的图像,如果我们滑动窗口不取(3, 3)而是取(2, 2),步长取2,那么最后我们会发现还剩下1个像素没法滑完,那怎么办呢?
我们可以在原先的矩阵加一层填充值,使得其变成6x6的矩阵,那么窗口就可以刚好把所有像素遍历完。这就是填充值的作用。
2.3 Activation function 激励函数
激励函数的作用是把卷积层输出结果做非线性映射。
CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱,图像如下。
3. Pooling layer (池化层–POOL)
在卷积层之后,通常在CNN层之间添加池化层。池化的功能是不断降低维数,以减少网络中的参数和计算次数。这缩短了训练时间并控制过度拟合。
简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
池化层的具体作用:
-
特征不变性
也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。 -
特征降维
我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。 - 在一定程度上防止过拟合,更方便优化
池化层用的方法有Max pooling 和 average pooling。
最常见的池类型是Max pooling,一般取大小为(2, 2)步长为2的filter,这样经过pooling之后,输入的长宽都会缩小2倍,channels不变。
Max pooling在每个窗口中占用最大值。需要事先指定这些窗口大小。这会降低特征图的大小,同时保留重要信息。
对于每个2 * 2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2 * 2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,如此类推。
Max Pooling主要的好处是当图片整个平移几个Pixel的话对判断上完全不会造成影响,以及有很好的抗杂讯功能。
4. Fully Connected layer(全连接层–FC)
全连接层的部分就是将之前的结果平坦化之后接到最基本的神经网络了。
两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的。
一个CNN例子
它的结构可以用:
X–>CONV(relu)–>MAXPOOL–>CONV(relu)–>FC(relu)–>FC(softmax)–>Y
来表示。
这里需要说明的是,在经过数次卷积和池化之后,我们 最后会先将多维的数据进行“扁平化”,也就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了。
可以从图中看到,随着网络的深入,我们的图像(严格来说中间的那些不能叫图像了,但是为了方便,还是这样说吧)越来越小,但是channels却越来越大了。在图中的表示就是长方体面对我们的面积越来越小,但是长度却越来越长了。
总结
卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。
CNN一个非常重要的特点就是头重脚轻(越往输入权值越小,越往输出权值越多),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。
卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。