卷积神经网络CNN介绍:结构框架,源码理解【转】
1. 卷积神经网络结构
卷积神经网络是一个多层的神经网络,每层都是一个变换(映射),常用卷积convention变换和pooling池化变换,每种变换都是对输入数据的一种处理,是输入特征的另一种特征表达;每层由多个二维平面组成,每个平面为各层处理后的特征图(feature map)。
常见结构:
输入层为训练数据,即原始数据,网络中的每一个特征提取层(C-层)都紧跟着一个二次提取的计算层(S-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力。具体C层和S层的个数不确定,依据具体案例而定;最后一个S,即完成了对原始数据的特征提取后,把S层的特征数据进行向量化(vector),然后连接到相应分类器。
一个具有7(输入层+c1+s2+c3+s4+c5+v)层网络结构的字母识别的CNN网络
2 卷积层Convolution作用:
卷积操作:用一个滤波器(就是一个小特征矩阵,也称卷积核)在图像矩阵上游走,在对应位置元素相乘,再把相乘的结果相加,最后相加的结果形成新的图像矩阵,游走完成后即完成了对原始图像的卷积变换(映射变换),形成此滤波器下的特征提取。
C层是一个特征提取层,为什么用卷积运算;卷积运算一个重要的特点就是,通过卷积运算,可以使原信号特征增强,并且降低噪音;例如用增强边缘的卷积去处理图像,处理后的图像边缘特征增强。
3 S层作用:
S-层可看作是模糊滤波器,起到二次特征提取的作用。S层又叫做subsample层,子采样层或者pooling(池化)层
在通过卷积获得了特征 (features)之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,例如 softmax分类器,但这样做面临计算量的挑战。例如:对于一个 96X96像素的图像,假设我们已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个 (96 − 8 + 1) * (96 − 8 + 1) = 7921 维的卷积特征,由于有 400个特征,所以每个样例 (example)都会得到一个 892 *400 = 3,168,400维的卷积特征向量。学习一
个拥有超过 3百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。
为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。
4 网络的前馈计算:
4.1C层卷积计算:
用一个可训练的滤波器kij去卷积一个输入的图像(第一阶段是输入的图像,后面的阶段就是S层的结果特征map了),然后加一个偏置bx,得到卷积层Cx。
假设层为s层特征图像Xil-1(pooling层),l层为卷积C层,卷积结果为Xjl
参数kij为两层间卷积核(滤波器,kernals),由于s层有m个特征,c层有n个特征,所以一共有m*n个卷积核。bj为卷基层每个结果特征对应的一个偏置项bias,f为非线性变换函数sigmoid函数;Mj为选择s层特征输入的个数,即选择多少个s层的图像特征作为输入;由于选择s层的特征个数方法不同,主要分为三种卷积选择方式
1、全部选择:
s层的全部特征都作为输入, Mj=m。如上图所示。
2、自动稀疏选择:
在卷积计算前加入稀疏稀疏aij,通过稀疏规则限制(论文后面),使算法自动选取部分s层特征作为输入,具体个数不确定。
3、部分选择:
按照一定的规则,固定的选取2个或者3个作为输入。
卷积结果特征图像大小计算:
假设输入特征图Feature Map大小为28*28。卷积核大小5*5。
卷积后特征图大小size(Cx)=(28-5+1,28-5+1)
Ps:卷积计算相当于神经网络中的前馈计算sigmoid(W*X+b),卷积核kij相当于系数矩阵W的一部分小切片,b为偏置项,详细介绍见上一篇博客:卷积Convolution和池化pooling特征提取,分类
卷积核kernals的来源:
1,随机初始化;2,用linear sparseautoencoder进行非监督特征学习,学习特征卷积
4.2 S层计算:
Pooling池化计算主要分为均值池化,最大值池化等,有的算法还在此话后进行sigmoid非线性变换;
直接均值池化
进行非线性变换池化
down(Xjl-1)表示下采样操作,就是对一个小区域进行pooling操作,使数据降维。
5.网络的反向传播:
可以先参考 :Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现了解一下cnn网络的前馈计算和误差反向传播的过程;之后再看Deep Learning论文笔记之(五)CNN卷积神经网络代码理解。
两个版本的cnn代码:
1,Deep learning:五十一(CNN的反向求导及练习)次cnn网络比较简单,而且感觉设计上面有些问题,cnn是为了提取特征来降低原始数据的,最后这个网络反而把数据量变大了,但是作为代码联系还是挺好的,网络简单,讲解详细。在此感谢tornadomeet;
2,Deep Learning论文笔记之(五)CNN卷积神经网络代码理解,此matlabdeeplearning toolbox中的代码,相比1中的代码,这个代码感觉标准了许多,采用栈式编程,用栈(matlab中的元包矩阵)来构架整个网络,显得结构紧凑,规整。(个人见解)。