CNN卷积神经网络深度解析
来源:互联网 发布:数据多样性 ppt 编辑:程序博客网 时间:2024/05/22 06:16
1. 概述
卷积神经网络是一种特殊的深层的神经网络模型,它的特殊性体现在两个方面,一方面它的神经元间的连接是非全连接的,另一方面同一层中某些神经元之间的连接的权重是共享的(即相同的)。它的非全连接和权值共享的网络结构使之更类似于生物神经网络,降低了网络模型的复杂度(对于很难学习的深层结构来说,这是非常重要的),减少了权值的数量。
卷积网络最初是受视觉神经机制的启发而设计的,是为识别二维形状而设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptive field)的概念,1984年日本学者Fukushima基于感受野概念提出的神经认知机(neocognitron)模型,它可以看作是卷积神经网络的第一个实现网络,也是感受野概念在人工神经网络领域的首次应用。
神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。神经认知机能够利用位移恒定能力从激励模式中学习,并且可识别这些模式的变化形。在其后的应用研究中,Fukushima将神经认知机主要用于手写数字的识别。随后,国内外的研究人员提出多种卷积神经网络形式,在邮政编码识别(Y. LeCun etc)、车牌识别和人脸识别等方面得到了广泛的应用。
2. CNN的结构
卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。这些良好的性能是网络在有监督方式下学会的,网络的结构主要有稀疏连接和权值共享两个特点,包括如下形式的约束:
1 特征提取。每一个神经元从上一层的局部接受域得到突触输人,因而迫使它提取局部特征。一旦一个特征被提取出来,只要它相对于其他特征的位置被近似地保留下来,它的精确位置就变得没有那么重要了。
2 特征映射。网络的每一个计算层都是由多个特征映射组成的,每个特征映射都是平面形式的。平面中单独的神经元在约束下共享相同的突触权值集,这种结构形式具有如下的有益效果:a.平移不变性。b.自由参数数量的缩减(通过权值共享实现)。
3.子抽样。每个卷积层跟着一个实现局部平均和子抽样的计算层,由此特征映射的分辨率降低。这种操作具有使特征映射的输出对平移和其他形式的变形的敏感度下降的作用。
2.1 稀疏连接(Sparse Connectivity)
卷积网络通过在相邻两层之间强制使用局部连接模式来利用图像的空间局部特性,在第m层的隐层单元只与第m-1层的输入单元的局部区域有连接,第m-1层的这些局部区域被称为空间连续的接受域。我们可以将这种结构描述如下:
设第m-1层为视网膜输入层,第m层的接受域的宽度为3,也就是说该层的每个单元与且仅与输入层的3个相邻的神经元相连,第m层与第m+1层具有类似的链接规则,如下图所示。
2.2 权值共享(Shared Weights)
在卷积网络中,每个稀疏过滤器
通过共享权值都会覆盖整个可视域,这些共享权值的单元构成一个特征映射,如下图所示。
2.3 The Full Model
卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。网络中包含一些简单元和复杂元,分别记为S-元和C-元。S-元聚合在一起组成S-面,S-面聚合在一起组成S-层,用Us表示。C-元、C-面和C-层(Us)之间存在类似的关系。网络的任一中间级由S-层与C-层串接而成,而输入级只含一层,它直接接受二维视觉模式,样本特征提取步骤已嵌入到卷积神经网络模型的互联结构中。
一般地,Us为特征提取层,每个神经元的输入与前一层的局部感受野相连,并提取该局部的特征,一旦该局部特征被提取后,它与其他特征间的位置关系也随之确定下来;Uc是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射为一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性(这一句表示没看懂,那位如果看懂了,请给我讲解一下)。此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数,降低了网络参数选择的复杂度。卷积神经网络中的每一个特征提取层(S-层)都紧跟着一个用来求局部平均与二次提取的计算层(C-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力。
下图是一个卷积网络的实例
图中所示的多层感知器包含近似 100000 个突触连接,但只有大约2600 个自由参数。自由参数在数量上显著地减少是通过权值共享获得的,学习机器的能力(以 VC 维的形式度量)因而下降,这又提高它的泛化能力。而且它对自由参数的调整通过反向传播学习的随机形式来实现。另一个显著的特点是使用权值共享使得以并行形式实现卷积网络变得可能。这是卷积网络对全连接的多层感知器而言的另一个优点。
3. CNN的学习
总体而言,前面提到的卷积网络可以简化为下图所示模型:
3.1 卷积层的学习
卷积层的典型结构如下图所示。
卷积层的前馈运算是通过如下算法实现的:
12345678910111213141516171819
ConvolutionLayer::fprop(input,output) { //取得卷积核的个数 int n=kernel.GetDim(0); for (int i=0;i<n;i++) { //第i个卷积核对应输入层第a个特征映射,输出层的第b个特征映射 //这个卷积核可以形象的看作是从输入层第a个特征映射到输出层的第b个特征映射的一个链接 int a=table[i][0], b=table[i][1]; //用第i个卷积核和输入层第a个特征映射做卷积 convolution = Conv(input[a],kernel[i]); //把卷积结果求和 sum[b] +=convolution; } for (i=0;i<(int)bias.size();i++) { //加上偏移量 sum[i] += bias[i]; } //调用Sigmoid函数 output = Sigmoid(sum);}
卷积层的反馈运算的核心代码如下:
123456789101112131415161718
ConvolutionLayer::bprop(input,output,in_dx,out_dx) { //梯度通过DSigmoid反传 sum_dx = DSigmoid(out_dx); //计算bias的梯度 for (i=0;i<bias.size();i++) { bias_dx[i] = sum_dx[i]; } //取得卷积核的个数 int n=kernel.GetDim(0); for (int i=0;i<n;i++) { int a=table[i][0],b=table[i][1]; //用第i个卷积核和第b个输出层反向卷积(即输出层的一点乘卷积模板返回给输入层),并把结果累加到第a个输入层 input_dx[a] += DConv(sum_dx[b],kernel[i]); //用同样的方法计算卷积模板的梯度 kernel_dx[i] += DConv(sum_dx[b],input[a]); }}
3.2 子采样层的学习
子采样层的典型结构如下图所示。
类似的字采样层的输出的计算式为:
123456789101112131415161718
SubSamplingLayer::fprop(input,output) { int n1= input.GetDim(0); int n2= input.GetDim(1); int n3= input.GetDim(2); for (int i=0;i<n1;i++) { for (int j=0;j<n2;j++) { for (int k=0;k<n3;k++) { //coeff 是可训练的权重,sw 、sh 是采样窗口的尺寸。 sub[i][j/sw][k/sh] += input[i][j][k]*coeff[i]; } } } for (i=0;i<n1;i++) { //加上偏移量 sum[i] = sub[i] + bias[i]; } output = Sigmoid(sum);}
子采样层的反馈运算的核心代码如下:
1234567891011121314151617181920
SubSamplingLayer::bprop(input,output,in_dx,out_dx) { //梯度通过DSigmoid反传 sum_dx = DSigmoid(out_dx); //计算bias和coeff的梯度 for (i=0;i<n1;i++) { coeff_dx[i] = 0; bias_dx[i] = 0; for (j=0;j<n2/sw;j++) for (k=0;k<n3/sh;k++) { coeff_dx[i] += sub[j][k]*sum_dx[i][j][k]; bias_dx[i] += sum_dx[i][j][k]); } } for (i=0;i<n1;i++) { for (j=0;j<n2;j++) for (k=0;k<n3;k++) { in_dx[i][j][k] = coeff[i]*sum_dx[i][j/sw][k/sh]; } }}
3.3 全连接层的学习
全连接层的学习与传统的神经网络的学习方法类似,也是使用BP算法,这里就不详述了。
关于CNN的完整代码可以参考https://github.com/ibillxia/DeepLearnToolbox/tree/master/CNN中的Matlab代码。
- CNN卷积神经网络深度解析
- 深度学习:卷积神经网络CNN
- 卷积神经网络CNN解析-针对斯坦福的深度学习教程
- 卷积神经网络(CNN)解析
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- 【五】Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- (6) Deep Learning模型之:CNN卷积神经网络之深度解析CNN
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- 机器学习-->深度学习-->卷积神经网络(CNN)
- 深度学习:卷积神经网络CNN变体
- linux 安装anaconda 使用国内镜像
- JDK的环境变量配置
- jzoj3927【NOIP2014模拟11.6】可见点数(欧拉函数)
- DB2或MySql的week_iso或weekOfYear()与java的Calendar.WEEK_OF_YEAR保持一致
- jdk1.7的环境变量配置
- CNN卷积神经网络深度解析
- bzoj 1098 poi2007 办公楼 bfs+链表
- 手势
- oracle启动报错:ORA-01157,ORA-01110
- int整数相乘溢出
- CSS定位分析与理解
- caffe for Windows图像分类训练、测试实例
- 文本选择
- 九误九建:企业做好SEO网络营销推广的必经之路