卷积神经网络中的卷积核是学习得来,还是预定义好的

1289人阅读
学术前沿(46)
原文地址:
作者:hjimce
卷积神经网络算法是n年前就有的算法,只是近年来因为深度学习相关算法为多层网络的训练提供了新方法,然后现在电脑的计算能力已非当年的那种计算水平,同时现在的训练数据很多,于是神经网络的相关算法又重新火了起来,因此卷积神经网络就又活了起来。
在开始前,我们需要明确的是网上讲的卷积神经网络的相关教程一般指的是神经网络的前向传导过程,反向传播都是用梯度下降法进行训练,大部分深度学习库,都已经把反向求导的功能给封装好了,如果想要深入学习反向求导,就需要自己慢慢学了。
因为卷积神经网络的经典模型是:Lenet-5实现,只要理解了这个的前向传导过程,基本上就OK了,因此我们后面主要讲解Lenet-5的实现。
一、理论阶段
作为CNN的入门文章,没有打算啰嗦太多的东西,因为什么权值共享、局部感受野什么的,讲那么多,都是那些生物学的相关理论,看了那些玩意,大部分初学者已经烦了。卷积神经网络的相关博文也是一大堆,但是讲的,基本上都是抄过来抄过去,就像我之前不理解从S2层到C3层是怎么实现的,网上看了一大堆教程,没有一个解答这个问题的。我的个人感觉整个过程,就只有S2到C3是最难理解的。接着我将用最浅显易懂的方式进行讲解。
卷积的概念这个我想只要学过图像处理的人都懂的概念了,这个不解释。我们知道对于给定的一幅图像来说,给定一个卷积核,卷积就是根据卷积窗口,进行像素的加权求和。
卷积神经网络与我们之前所学到的图像的卷积的区别,我的理解是:我们之前学图像处理遇到卷积,一般来说,这个卷积核是已知的,比如各种边缘检测算子、高斯模糊等这些,都是已经知道卷积核,然后再与图像进行卷积运算。然而深度学习中的卷积神经网络卷积核是未知的,我们训练一个神经网络,就是要训练得出这些卷积核,而这些卷积核就相当于我们学单层感知器的时候的那些参数W,因此你可以把这些待学习的卷积核看成是神经网络的训练参数W。
刚开始学习CNN的时候,看到这个词,好像高大上的样子,于是查了很多资料,理论一大堆,但是实践、算法实现却都没讲到,也不懂池化要怎么实现?其实所谓的池化,就是图片下采样。这个时候,你会发现CNN每一层的构建跟图像高斯金字塔的构建有点类似,因此你如果已经懂得了图像金字塔融合的相关算法,那么就变的容易理解了。在高斯金子塔构建中,每一层通过卷积,然后卷积后进行下采样,而CNN也是同样的过程。废话不多说,这里就讲一下,CNN的池化:
CNN的池化(图像下采样)方法很多:Mean pooling(均值采样)、Max pooling(最大值采样)、Overlapping (重叠采样)、L2 pooling(均方采样)、Local Contrast Normalization(归一化采样)、Stochasticpooling(随即采样)、Def-pooling(形变约束采样)。其中最经典的是最大池化,因此我就解释一下最大池化的实现:
为了简单起见,我用上面的图片作为例子,假设上面的图片大小是4*4的,如上图所示,然后图片中每个像素点的值是上面各个格子中的数值。然后我要对这张4*4的图片进行池化,池化的大小为(2,2),跨步为2,那么采用最大池化也就是对上面4*4的图片进行分块,每个块的大小为2*2,然后统计每个块的最大值,作为下采样后图片的像素值,具体计算如下图所示:
也就是说我们最后得到下采样后的图片为:
这就是所谓的最大池化。当然以后你还会遇到各种池化方法,比如均值池化,也就是对每个块求取平均值作为下采样的新像素值。还有重叠采样的池化,我上面这个例子是没有重叠的采样的,也就是每个块之间没有相互重叠的部分,上面我说的跨步为2,就是为了使得分块都非重叠,等等,这些以后再跟大家解释池化常用方法。这里就先记住最大池化就好了,因为这个目前是最常用的。
3、feature maps&
这个单词国人把它翻译成特征图,挺起来很专业的名词。那么什么叫特征图呢?特征图其实说白了就是CNN中的每张图片,都可以称之为特征图张。在CNN中,我们要训练的卷积核并不是仅仅只有一个,这些卷积核用于提取特征,卷积核个数越多,提取的特征越多,理论上来说精度也会更高,然而卷积核一堆,意味着我们要训练的参数的个数越多。在LeNet-5经典结构中,第一层卷积核选择了6个,而在AlexNet中,第一层卷积核就选择了96个,具体多少个合适,还有待学习。
回到特征图概念,CNN的每一个卷积层我们都要人为的选取合适的卷积核个数,及卷积核大小。每个卷积核与图片进行卷积,就可以得到一张特征图了,比如LeNet-5经典结构中,第一层卷积核选择了6个,我们可以得到6个特征图,这些特征图也就是下一层网络的输入了。我们也可以把输入图片看成一张特征图,作为第一层网络的输入。
4、CNN的经典结构
对于刚入门CNN的人来说,我们首先需要现在的一些经典结构:
(1)LeNet-5。这个是n多年前就有的一个CNN的经典结构,主要是用于手写字体的识别,也是刚入门需要学习熟悉的一个网络,我的这篇博文主要就是要讲这个网络
(2)AlexNet。
在imagenet上的图像分类challenge上大神Alex提出的alexnet网络结构模型赢得了2012届的冠军,振奋人心,利用CNN实现了图片分类,别人用传统的机器学习算法调参跳到半死也就那样,Alex利用CNN精度远超传统的网络。
其它的还有什么《Network In Network》,GoogLeNet、Deconvolution Network,在以后的学习中我们会遇到。比如利用Deconvolution Network反卷积网络实现图片的去模糊,牛逼哄哄。
& & OK,理论阶段就啰嗦到这里就好了,接着就讲解&LeNet-5,&LeNet-5是用于手写字体的识别的一个经典CNN:
LeNet-5结构
输入:32*32的手写字体图片,这些手写字体包含0~9数字,也就是相当于10个类别的图片
输出:分类结果,0~9之间的一个数
因此我们可以知道,这是一个多分类问题,总共有十个类,因此神经网络的最后输出层必然是SoftMax问题,然后神经元的个数是10个。LeNet-5结构:
输入层:32*32的图片,也就是相当于1024个神经元
C1层:paper作者,选择6个特征卷积核,然后卷积核大小选择5*5,这样我们可以得到6个特征图,然后每个特征图的大小为32-5+1=28,也就是神经元的个数由1024减小到了28*28=784。
S2层:这就是下采样层,也就是使用最大池化进行下采样,池化的size,选择(2,2),也就是相当于对C1层28*28的图片,进行分块,每个块的大小为2*2,这样我们可以得到14*14个块,然后我们统计每个块中,最大的值作为下采样的新像素,因此我们可以得到S1结果为:14*14大小的图片,共有6个这样的图片。
C3层:卷积层,这一层我们选择卷积核的大小依旧为5*5,据此我们可以得到新的图片大小为14-5+1=10,然后我们希望可以得到16张特征图。那么问题来了?这一层是最难理解的,我们知道S2包含:6张14*14大小的图片,我们希望这一层得到的结果是:16张10*10的图片。这16张图片的每一张,是通过S2的6张图片进行加权组合得到的,具体是怎么组合的呢?问题如下图所示:
为了解释这个问题,我们先从简单的开始,我现在假设输入6特征图的大小是5*5的,分别用6个5*5的卷积核进行卷积,得到6个卷积结果图片大小为1*1,如下图所示:
& & 为了简便起见,我这里先做一些标号的定义:我们假设输入第i个特征图的各个像素值为x1i,x2i……x25i,因为每个特征图有25个像素。因此第I个特征图经过5*5的图片卷积后,得到的卷积结果图片的像素值Pi可以表示成:
这个是卷积公式,不解释。因此对于上面的P1~P6的计算方法,这个就是直接根据公式。然后我们把P1~P6相加起来,也就是:
P=P1+P2+……P6
把上面的Pi的计算公式,代入上式,那么我们可以得到:
其中X就是输入的那6张5*5特征图片的各个像素点值,而W就是我们需要学习的参数,也就相当于6个5*5的卷积核,当然它包含着6*(5*5)个参数。因此我们的输出特征图就是:
Out=f(P+b)
这个就是从S2到C3的计算方法,其中b表示偏置项,f为激活函数。
我们回归到原来的问题:有6张输入14*14的特征图片,我们希望用5*5的卷积核,然后最后我们希望得到一张10*10的输出特征图片?
根据上面的过程,也就是其实我们用5*5的卷积核去卷积每一张输入的特征图,当然每张特征图的卷积核参数是不一样的,也就是不共享,因此我们就相当于需要6*(5*5)个参数。对每一张输入特征图进行卷积后,我们得到6张10*10,新图片,这个时候,我们把这6张图片相加在一起,然后加一个偏置项b,然后用激活函数进行映射,就可以得到一张10*10的输出特征图了。
& & 而我们希望得到16张10*10的输出特征图,因此我们就需要卷积参数个数为16*(6*(5*5))=16*6*(5*5)个参数。总之,C3层每个图片是通过S2图片进行卷积后,然后相加,并且加上偏置b,最后在进行激活函数映射得到的结果。
S4层:下采样层,比较简单,也是知己对C3的16张10*10的图片进行最大池化,池化块的大小为2*2。因此最后S4层为16张大小为5*5的图片。至此我们的神经元个数已经减少为:16*5*5=400。
C5层:我们继续用5*5的卷积核进行卷积,然后我们希望得到120个特征图。这样C5层图片的大小为5-5+1=1,也就是相当于1个神经元,120个特征图,因此最后只剩下120个神经元了。这个时候,神经元的个数已经够少的了,后面我们就可以直接利用全连接神经网络,进行这120个神经元的后续处理,后面具体要怎么搞,只要懂多层感知器的都懂了,不解释。
上面的结构,只是一种参考,在现实使用中,每一层特征图需要多少个,卷积核大小选择,还有池化的时候采样率要多少,等这些都是变化的,这就是所谓的CNN调参,我们需要学会灵活多变。
比如我们可以把上面的结构改为:C1层卷积核大小为7*7,然后把C3层卷积核大小改为3*3等,然后特征图的个数也是自己选,说不定得到手写字体识别的精度比上面那个还高,这也是有可能的,总之一句话:需要学会灵活多变,需要学会CNN的调参。
二、实战阶段
学习CNN的源码实现网站:
1、训练数据获取
在theano学习库中有手写字体的库,可以从网上下载到,名为:mnist.pkl.gz的手写字体库,里面包含了三个部分的数据,训练数据集train_set:50000个训练样本,验证集valid_set,我们可以用如下的代码读取这些数据,然后用plot显示其中的一张图片:
[python]&&
在上面的代码中我显示的是第8张图片,可以看到如下结果:
第八个样本是数字1。
2、LeNet-5实现
首先你要知道mnist.pkl.gz这个库给我们的图片的大小是28*28的,因此我们可以第一步选择5*5的卷积核进行卷积得到24*24,同时我们希望C1层得到20张特征图,等等,具体的代码实现如下;
[python]&&
训练结果:
参考文献:
1、http://blog.csdn.net/zouxy09/article/details/8775360/
2、http://www.deeplearning.net/tutorial/lenet.html#lenet
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:53944次
排名:千里之外
转载:60篇
评论:10条
(2)(1)(1)(4)(11)(20)(4)(18)(1)知识|卷积神经网络为什么有效,隐含层到底是什么样的特征
知识|卷积神经网络为什么有效,隐含层到底是什么样的特征
卷积神经网络各模型识别结果图1.各模型识别结果上述是各类网络模型的结果,要想知道神经网络为何有效,首先需要知道卷积神经网络各个层的输出是什么样子,也就是特征可视化的过程。推荐论文《Visualizing and Understanding Convolutional Networks》特征可视化1.首先给个整体的可视化结果图图2.卷积神经网络中间层可视化2.具体到每一层所谓卷积神经网络,就是会自动的对于一张图片学习出最好的卷积核以及这些卷积核的组合方式,也就是对于一张图片的任务来说,求出最好的图片对于本任务的特征的表达,然后来进行判断。资源来自知乎作者:雨宫夏一第一个卷积层:简单的边缘第二个卷积层:边缘的组合第三个卷积层:初步信息第五个卷积层:可认识的图像本身CNN的核心在于卷积核,其实关于卷积核还有另一个名字叫做滤波器,从信号处理的角度而言,滤波器是对信号做频率筛选,这里主要是空间-频率的转换,CNN的训练就是找到最好的滤波器使得滤波后的信号更容易分类,还可以从模版匹配的角度看卷积,每个卷积核都可以看成一个特征模版。后记本头条号此阶段每天为大家更新一些深度学习、机器学习、图像处理、自然语言处理、算法工程师方向的知识。欢迎大家转发和评论,让刷头条的零散时间也能助你一臂之力!下篇文章介绍如何特征可视化
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
百家号 最近更新:
简介: 喜欢学习科技发明,上网有趣的东西
作者最新文章9559人阅读
机器学习(36)
深度学习笔记1(卷积神经网络)
&&&&&&&& 在看完了UFLDL教程之后,决定趁热打铁,继续深度学习的学习,主要想讲点卷积神经网络,卷积神经网络是深度学习的模型之一,还有其它如AutoEncoding、Deep Belief Network、Restricted Boltzmann Machine和sparse coding等。
&&&&&&&& 在UFLDL教程中提到了针对大型图像的处理,使用卷积和池化的概念。原因主要对于全连接网络,需要的参数就有很多。比如对于一副的图像,hidden layer也为1000000个神经元,那么需要学习的参数就是10^12,这样从计算的角度来说,将会变得非常耗时;此外全连接,将会忽略掉图像内部的拓扑结构。因此我们采用部分连接网络,这就是卷积神经网络的要点之一—局部感受野,卷积神经网络还有两个卖点,就是权值共享和时空亚采样。
局部感受野
&&&&&&&& 每个隐含单元仅仅只能连接输入单元的一部分。例如,每个隐含单元仅仅连接输入图像的一小片相邻区域。比如我们每个隐含单元只与10*10的区域相连接,那么我们参数的个数就变为了10^8,降低了10000倍,这样训练起来就没有那么费力了。这一思想主要受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激),此外图像的像素也是局部时空相关的。
如下图所示,左边就是全连接网络,每个隐藏神经元与每个像素进行连接。右边就是部分连接网络,每个隐神经元只与一部分区域相连接。
& & & & & & & & & & & & &
权值共享
&&&&&&&& 部分连接以后,参数降低了很多,但是感觉参数还是有很多,怎么办呢?我们进行权值共享,权值共享的意思是每个隐神经元连接的100个参数都是相同,那么训练参数就降低到10*10=100个了。参数真的是极大的简化了啊!这个思想主要来源于:自然图像有其固有特性,也就是说,图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。
&&&&&&&& 如果隐神经元与其连接的100个输入单元具有相同的100个参数,那么就相当于是一个10*10的模板在原始的输入图像上做卷积(当然需要加上一个偏置参数b),这样相当于得到一个新的图像,新图像的大小为(;1)*(;1),因此也得名卷积神经网络。这样的10*10的模板,我们也把它称为一个卷积核。此外只用一个卷积核提取得到的特征往往是不充分的,只能算作是一种类型的特征(比如某个方向的边缘),如果我们要提取其它方向的边缘,那就多弄几个卷积核呗,这样就变成了多卷积核了。假设有k个卷积核,那么可训练的参数的个数就变为了k*10*10。注意没有包含偏置参数。每个卷积核得到一副特征图像也被称为一个Feature
&&&&&&&& 卷积的过程也被称为特征提取的过程,通常该层用Cx来标记,其中C是convolution的意思,x表示是第几层。
时空亚采样
&&&&&&&& 降低图像的分辨率,可以减少输出对于变形和扭曲的敏感性。此外,在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,例如 softmax 分类器,但这样做面临计算量的挑战。例如:对于一个 96X96 像素的图像,假设我们已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个 (96 - 8 + 1) * (96 - 8 + 1) = 7921 维的卷积特征,由于有 400 个特征,所以每个样例(example)
都会得到一个 892 * 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。
&&&&&&&& 为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化
(取决于计算池化的方法)。
&&&&&&&& 池化的过程通常也被称为特征映射的过程,通常该层用Sx表示,S就是sumsampling的意思,x表示第几层。
多层卷积网络—典型的例子
&&&&&&&& 下面我们用一个典型的数字识别系统LeNet-5来讲解挫等卷积网络。以下是其leNet-5多层网络的示意图,总共包含了7层,不包含输入层。
& & & & & & & & & &&
&&&&&&&& 输入原始图像的大小是32*32,卷积层用Cx表示,亚采样层用Sx表示,全连接层用Fx表示,x表示第x层。
&&&&&&&& C1层是卷积层,用了6个卷积核,这样就得到了6个feature map,其中每个卷积核的大小为5*5,用每个卷积核与原始的输入图像进行卷积,这样feature map的大小为(32-5+1)* (32-5+1)= 28*28,所需要的参数的个数为(5*5+1)*6= 156(其中5*5为卷积模板参数,1为偏置参数),连接数为(5*5+1)*28*28*6=122304(其中28*28为卷积后图像的大小)。
&&&&&&&& S2层为采样层,也可以说是池化或者特征映射的过程,拥有6个feature maps,每个feature map的大小为14*14,每个feature map的隐单元与上一层C1相对应的feature map的2*2单元相连接,这里没有重叠。计算过程是:2*2单元里的值相加然后再乘以训练参数w,再加上一个偏置参数b(每一个feature
map共享相同w和b),然后取sigmoid值,作为对应的该单元的值。所以S2层中每个featuremap的长宽都是上一层C1的一半。S2层需要2*6=12个参数,连接数为(4+1)*14*14*6
= 5880.【这里池化的过程与ufldl教程中略有不同。】
&&&&&&&& C3层也是一个卷积层,有16个卷积核,卷积模板的大小为5*5,因此具有16个feature maps,每个featuremap的大小为(14-5+1)*(14-5+1)= 10*10。每个feature map只与上一层S2中部分feature maps相连接,下表给出了16个feature maps与上一层S2的连接方式(行为S2层feature map的标号,列为C3层feature map的标号,第一列表示C3层的第0个feature map只有S2层的第0、1和2这三个feature
maps相连接,其它解释类似)。为什么要采用部分连接,而不采用全连接呢?首先就是部分连接,可计算的参数就会比较少,其次更重要的是它能打破对称性,这样就能得到输入的不同特征集合。以第0个feature map描述计算过程:用1个卷积核(对应3个卷积模板,但仍称为一个卷积核,可以认为是三维卷积核)分别与S2层的3个feature
maps进行卷积,然后将卷积的结果相加,再加上一个偏置,再取sigmoid就可以得出对应的feature map了。所需要的参数数目为(5*5*3+1)*6 +( 5*5*4+1)*9 +5*5*6+1
= 为卷积参数,该卷积核有3个卷积模板),连接数为= 论文年论文给出的结果是156000,个人认为这是错误的,因为一个卷积核只有一个偏置参数)。
&&&&&&&&&&&
&&&&&&&& 同理,S4层也是采样层,有16个feature maps,每个featuremap的大小为5*5,计算过程和S2类似,需要参数个数为16*2 = 32个,连接数为(4+1)*5*5*16 = 2000.
&&&&&&&& C5为卷积层,有120个卷积核,卷积核的大小仍然为5*5,因此有120个feature maps,
每个feature map的大小都与上一层S4的所有feature maps进行连接,这样一个卷积核就有16个卷积模板。Feature map的大小为1*1,这样刚好变成了全连接,但是我们不把它写成F5,因为这只是巧合。C5层有120*(5*5*16+1) = 48120(16为上一层所有的feature maps个数)参数,连接数也是这么多。
&&&&&&&& F6层有86个神经单元,每个神经单元与C5进行全连接。它的连接数和参数均为86*120= 10164。这样F6层就可以得到一个86维特征了。后面可以使用该86维特征进行做分类预测等内容了。
&&&&&&&& 大体的多层神经网络卷积和采样的过程基本讲完。如有问题欢迎留言交流!注意:这里卷积和池化的计算过程和ufldl教程中的计算略有不同。
1:UFLDL教程:
2:1998年论文:Gradient-BasedLearning Applied to Document Recognition
3:卷积神经网络
4:&Deep Learning(深度学习)学习笔记整理系列之(七)
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:846938次
积分:9314
积分:9314
排名:第1896名
原创:161篇
转载:33篇
评论:283条
文章:15篇
阅读:129345
文章:16篇
阅读:171143
(1)(2)(1)(1)(1)(1)(4)(14)(13)(34)(13)(5)(8)(4)(3)(4)(6)(7)(6)(1)(1)(4)(9)(19)(5)(8)(1)(6)(6)(6)

我要回帖

 

随机推荐