一、卷积神经网络基本概念
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一,是深度学习算法在图像处理领域的一个应用。
机器学习分类:监督学习(分类,回归),无监督学习(聚类,降维),强化学习,半监督学习,深度学习。
卷积神经网络是一种特殊的深层的神经网络模型,它的特殊性体现在两个方面,一方面它的神经元间的连接是非全连接的, 另一方面同一层中某些神经元之间的连接的权重是共享的(即相同的)。它的非全连接和权值共享的网络结构使之更类似于生物 神经网络,降低了网络模型的复杂度(对于很难学习的深层结构来说,这是非常重要的),减少了权值的数量。
卷积神经网络与普通神经网络非常相似,它们都由具有可学习的权重和偏置常量(biases)的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的分数,普通神经网络里的一些计算技巧到这里依旧适用。
所以哪里不同呢?卷积神经网络默认输入是图像,可以让我们把特定的性质编码入网络结构,使是我们的前馈函数更加有效率,并减少了大量参数。
二、 CNN网络层级结构 ----CNN网络一共有5个层级结构:输入层-卷积层-激活层-池化层-全连接输出层.
![v2-a6f364f9e7ed267fc9be322edf63b2be_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-a6f364f9e7ed267fc9be322edf63b2be_b.jpg)
1.输入层: 与传统神经网络/机器学习一样,模型需要输入的进行预处理操作,常见的3中预处理方式有:
- 去均值
- 归一化
- PCA/SVD降维等
2.卷积层(convolution layer):初步提取特征
卷积层的作用:提取图片每个小部分里具有的特征
假定我们有一个尺寸为6*6 的图像,每一个像素点里都存储着图像的信息。我们再定义一个卷积核(相当于权重),用来从图像中提取一定的特征。卷积核与数字矩阵对应位相乘再相加,得到卷积层输出结果。
![v2-3e405fd610d67d25167f04b61790b5c4_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-3e405fd610d67d25167f04b61790b5c4_b.jpg)
卷积核的取值在没有以往学习的经验下,可由函数随机生成,再逐步训练调整。
当所有的像素点都至少被覆盖一次后,就可以产生一个卷积层的输出(下图的步长为1)
![v2-736690f37bb61b4c3117134081ea91e3_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-736690f37bb61b4c3117134081ea91e3_b.jpg)
机器一开始并不知道要识别的部分具有哪些特征,是通过与不同的卷积核相作用得到的输出值,相互比较来判断哪一个卷积核最能表现该图片的特征——比如我们要识别图像中的某种特征(比如曲线),也就是说,这个卷积核要对这种曲线有很高的输出值,对其他形状(比如三角形)则输出较低。卷积层输出值越高,就说明匹配程度越高,越能表现该图片的特征。
卷积层具体工作过程:
比如我们设计的一个卷积核如下左,想要识别出来的曲线如下右:
![v2-28e437829df20058b4469031cc3b3647_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-28e437829df20058b4469031cc3b3647_b.jpg)
现在我们用上面的卷积核,来识别这个简化版的图片——一只漫画老鼠
![v2-1e1d414d627e5d651628785add66e5d4_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-1e1d414d627e5d651628785add66e5d4_b.jpg)
当机器识别到老鼠的屁股的时候,卷积核与真实区域数字矩阵作用后,输出较大:6600
![v2-3066328baa05fa7abf30bd6d903a91bb_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-3066328baa05fa7abf30bd6d903a91bb_b.jpg)
而用同一个卷积核,来识别老鼠的耳朵的时候,输出则很小:0
![v2-96babdafc2b7003b59a58a91470d1fd6_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-96babdafc2b7003b59a58a91470d1fd6_b.jpg)
我们就可以认为:现有的这个卷积核保存着曲线的特征,匹配识别出来了老鼠的屁股是曲线的。我们则还需要其他特征的卷积核,来匹配识别出来老鼠的其他部分。卷积层的作用其实就是通过不断的改变卷积核,来确定能初步表征图片特征的有用的卷积核是哪些,再得到与相应的卷积核相乘后的输出矩阵。
Zero Padding
我们的图片由4*4,通过卷积层变为3*3,再通过池化层变化2*2,如果我们再添加层,那么图片岂不是会越变越小?这个时候我们就会引出“Zero Padding”(补零),它可以帮助我们保证每次经过卷积或池化输出后图片的大小不变,如,上述例子我们如果加入1的Zero Padding,再采用3*3的卷积核,那么变换后的图片尺寸与原图片尺寸相同,如下图所示
![v2-818796733bad19c9991913e36eed13a8_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-818796733bad19c9991913e36eed13a8_b.jpg)
通常情况下,我们希望图片做完卷积操作后保持图片大小不变,所以我们一般会选择尺寸为3*3的卷积核和1的zero padding,或者5*5的卷积核与2的zero padding,这样通过计算后,可以保留图片的原始尺寸。那么加入zero padding后的feature_map尺寸 =( width + 2 * padding_size - filter_size )/stride + 1
注:这里的width也可换成height,此处是默认正方形的卷积核,weight = height,如果两者不相等,可以分开计算,分别补零
空间排列(Spatial arrangement)
一个输出单元的大小有以下三个量控制:depth, stride 和 zero-padding。
- 深度(depth) : 顾名思义,它控制输出单元的深度,也就是filter的个数,连接同一块区域的神经元个数。又名:depth column
- 步幅(stride):它控制在同一深度的相邻两个隐含单元,与他们相连接的输入区域的距离。如果步幅很小(比如 stride = 1)的话,相邻隐含单元的输入区域的重叠部分会很多; 步幅很大则重叠区域变少。
- 补零(zero-padding) : 我们可以通过在输入单元周围补零来改变输入单元整体大小,从而控制输出单元的空间大小。
局部感知:人的大脑识别图片的过程中,并不是一下子整张图同时识别,而是对于图片中的每一个特征首先局部感知,然后更高层次对局部进行综合操作,从而得到全局信息。
卷积层使用“卷积核(滤波器filter)”进行局部感知。举个例子来讲,一个32×32×3(彩色图为3通道或深度为3)的RGB图经过一层5×5×3的卷积后变成了一个28×28×1的特征图,那么输入层共有32×32×3=3072个神经元,第一层隐层会有28×28=784个神经元,这784个神经元对原输入层的神经元只是局部连接,如下图所示:
![v2-3af218588284b9cdfa77508cf4a10449_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-3af218588284b9cdfa77508cf4a10449_b.jpg)
通过局部感知特性,大大减少了模型的计算参数。但是仅仅这样还是依然会有很多参数。这就有了权值共享机制:
在上面的局部感知中,假设有1m的隐层神经元,每个神经元10*10的连接,这样就会有1m*10*10个参数。实际上,对于每一层来讲,所有神经元对应的权值应该是相等的,也就是说,第一个神经元的参数向量为[w1,w2,…,w100],那么其他同层的神经元也是[w1,w2,…,w100],这就是权值共享。
为什么需要权值共享呢?同一层下的神经元的连接参数只与特征提取的有关,而与具体的位置无关,因此可以保证同一层中所有位置的连接是权值共享的。例如:第一层隐层是一般用边缘检测,第二层是对第一层学到的边缘曲线组合得到一些特征,比如:角度、线形等;第三层会学到更加复杂的特征,比如:眼睛、眉毛等。对于同一层来说,他们提取特征的方式是一样的,第三层的神经元都是用来提取“眼睛”的特征,因此,需要计算的参数是一样的。
3、激活层
所谓激励,实际上是对卷积层的输出结果做一次非线性映射
卷积之后,通常会加入偏置(bias), 并引入非线性激活函数(activation function),这里定义bias为b,activation function 是
这里请注意,bias不与元素位置相关,只与层有关。主流的activation function 有,
- 线性整流单元(ReLU):
![v2-25f3ae7165461dde90e6ece23f4988be_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-25f3ae7165461dde90e6ece23f4988be_b.jpg)
- Sigmoid函数:
![v2-5ed550518bb5724f4b123cc62864b0ba_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-5ed550518bb5724f4b123cc62864b0ba_b.jpg)
- tanh函数:
![v2-159df75e7ddb6f68e18520cac1780621_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-159df75e7ddb6f68e18520cac1780621_b.jpg)
根据实际参数大小等性质调整。
图中feature maps volume的每个元素就是由
![v2-29c6a285d82ee376f34d8fd265908310_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-29c6a285d82ee376f34d8fd265908310_b.jpg)
例如采用277*277的RGB图像, 采用96个11*11*3的kernels(卷积核)同时扫描,很容易得到输出的feature maps是96个267*267的二维 feature map, 267*267是单个图像feature map的x,y轴大小,96是卷积核个数,原本的3通道在积分的时候会被作为一个元素加起来。 如上图,这些feature map可视化之后,可以看到4 和35表示边缘特征,23是模糊化的输入,10和16在强调灰度变化,39强调眼睛,45强调红色通道的表现。
4、池化层(pooling layer):提取主要特征,减少特征数目
池化(Pooling):也称为欠采样或下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。
池化层的输入就是卷积层输出的原数据与相应的卷积核相乘后的输出矩阵 ;
池化层的目的:
- 为了减少训练参数的数量,降低卷积层输出的特征向量的维度
- 减小过拟合现象,只保留最有用的图片信息,减少噪声的传递
最常见的两种池化层的形式:
- 最大池化:max-pooling——选取指定区域内最大的一个数来代表整片区域(提取图片纹理)
- 均值池化:mean-pooling——选取指定区域内数值的平均值来代表整片区域(保留背景特征)
举例说明两种池化方式:(池化步长为2,选取过的区域,下一次就不再选取)
![v2-64b3c861adf7a5ea0f9d9c95622a9519_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-64b3c861adf7a5ea0f9d9c95622a9519_b.jpg)
5、Flatten层(扁平化层)
做完Pooling层后,我们就会把这些数据“拍平”,丢到Flatten层,然后把Flatten层的output放到full connected Layer里,采用softmax对其进行分类。
![v2-39069129604f6dbcd99adfd1758a44a0_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-39069129604f6dbcd99adfd1758a44a0_b.jpg)
6、全连接输出层(fully connected output layer)
出现在CNN中的全连接网络(fully connected network)主要目的是为了分类, 这里称它为network的原因是,目前CNNs多数会采用多层全连接层,这样的结构可以被认为是网络。如果只有一层,下边的叙述同样适用。它的结构可能如下图所示:
![v2-84c02ac6ad032780902c0bcd1a4e4aee_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=e9ecf4ca-cc2e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-84c02ac6ad032780902c0bcd1a4e4aee_b.jpg)
图2,全连接层结构
不同于CNN的滑动卷积,全连接网络每一层的所有单元与上一层完全连接。通常,除了输入层和输出层的其他层,都被认为是隐含层。如图2所示,对于第
考虑activation function之后,对于第
计算这一层中的所有神经元之后, 作为下一层的输入。
全连接网络和CNN的数学表达结构其实很相似,只是不存在关于图像空间上的滑动卷积。
目标函数与训练方法
CNN网络的训练误差需要通过一个目标函数来衡量,目前比较流行的目标函数是均方误差(Mean Square Error)和K-L散度(K-L divergence),对于输出层的误差公式很容易判断:
- MSE:
----------------------------(1)
- K-L divergence :
其中
K-L divergence 和MSE原理本文不再过多介绍,通常K-L divergence的权重更新会比MSE更快。