1 / 30
文档名称:

CNN卷积神经网络原理.docx

格式:docx   大小:235KB   页数:30页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

CNN卷积神经网络原理.docx

上传人:帅气的小哥哥 2024/5/12 文件大小:235 KB

下载得到文件列表

CNN卷积神经网络原理.docx

相关文档

文档介绍

文档介绍:该【CNN卷积神经网络原理 】是由【帅气的小哥哥】上传分享,文档一共【30】页,该文档可以免费在线阅读,需要了解更多关于【CNN卷积神经网络原理 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。N卷积神经网络原理简介http://blog./u012162613/article/details/43225445N的实现代码。N,在此推荐周晓艺师兄的博文:DeepLearning〔深度学****学****笔记整理系列之〔七〕,以及UFLDL上的卷积特征提取、池化CNN的最大特点就是稀疏连接〔局部感受〕和权值共享,如下面两图所示,左为稀疏连接,右为权值共享。稀疏连接和权值共享可以减少所要训练的参数,减少计算复杂度。????N的结构,5来说明:这个图真是无处不在,N,5,这图来自于这篇论文:Gradient-BasedLearningAppliedtoDocumentRecognition,论文很长,5这个结构,建议看看那局部。我这里简单说一下,5这张图从左到右,先是input,这是输入层,即输入的图片。input-layer到C1这局部就是一个卷积层〔convolution运算〕,C1到S2是一个子采样层〔pooling运算〕,关于卷积和子采样的具体过程可以参考以下图:然后,S2到C3又是卷积,C3到S4又是子采样,可以发现,卷积和子采样都是成对出现的,卷积后面一般跟着子采样。S4到C5之间是全连接的,这就相当于一个MLP的隐含层了〔如果你不清楚MLP,参考?DeepLearningtutorial〔3〕MLP多层感知机原理简介+代码详解?〕。C5到F6同样是全连接,也是相当于一个MLP的隐含层。最后从F6到输出output,其实就是一个分类器,这一层就叫分类层。N的根本结构大概就是这样,由输入、卷积层、子采样层、全连接层、分类层、输出这些根本“构件〞组成,一般根据具体的应用或者问题,去确定要多少卷积层和子采样层、采用什么分类器。当确定好了结构以后,如何求解层与层之间的连接参数?一般采用向前传播〔FP〕+向后传播〔BP〕的方法来训练。具体可参考上面给出的链接。N卷积神经网络代码详细解读〔基于python+theano〕代码来自于深度学****教程:works(),5,具体如下:没有实现location-specificgainandbiasparameters用的是maxpooling,而不是average_pooling分类器用的是softmax,5用的是rbf5第二层并不是全连接的,本程序实现的是全连接另外,代码里将卷积层和子采用层合在一起,定义为“ConvPoolLayer“〔卷积采样层〕,这好理解,因为它们总是成对出现。但是有个地方需要注意,代码中将卷积后的输出直接作为子采样层的输入,而没有加偏置b再通过sigmoid函数进行映射,即没有了以下图中fx后面的bx以及sigmoid映射,也即直接由fx得到Cx。最后,代码中第一个卷积层用的卷积核有20个,第二个卷积层用50个,5图中所示的6个和16个。了解了这些,下面看代码:〔1〕导入必要的模块[python]?viewplain?copyimport?cPickle??import?gzip??import?os??import?sys??import?time????import?numpy????import?theano??import??as?T??from??import?downsample??from??import?conv??〔2〕N的根本"构件"CNN的根本构件包括卷积采样层、隐含层、分类器,如下ConvPoolLayer〔卷积+采样层〕见代码注释:[python]?viewplain?copy"""?卷积+ConvPoolLayer?rng:随机数生成器,用于初始化W?input:4维的向量,?filter_shape:(number?of?filters,?num?input?feature?maps,filter?height,?filter?width)?image_shape:(batch?size,?num?input?feature?maps,image?height,?image?width)?poolsize:?(#rows,?#cols)?"""??class?ConvPoolLayer(object):??????def?__init__(self,?rng,?input,?filter_shape,?image_shape,?poolsize=(2,?2)):??????#assert?condition,condition为True,那么继续往下执行,condition为False,中断程序??#image_shape[1]和filter_shape[1]都是num?input?feature?maps,它们必须是一样的。??????????assert?image_shape[1]?==?filter_shape[1]???????????=?input????#每个隐层神经元〔即像素〕与上一层的连接数为num?input?feature?maps?*?filter?height?*?filter?width。??#(filter_shape[1:])来求得??????????fan_in?=?(filter_shape[1:])????#lower?layer上每个神经元获得的梯度来自于:"num?output?feature?maps?*?filter?height?*?filter?width"?/pooling?size??????????fan_out?=?(filter_shape[0]?*?(filter_shape[2:])?/?????????????????????(poolsize))???????????????????????#以上求得fan_in、fan_out?,将它们代入公式,以此来随机初始化W,W就是线性卷积核??????????W_bound?=?(6.?/?(fan_in?+?fan_out))???????????=?(??????????????(??????????????????(low=-W_bound,?high=W_bound,?size=filter_shape),??????????????????dtype=??????????????),??????????????borrow=True??????????)????#?the?bias?is?a?1D?tensor?--?one?bias?per?output?feature?map??#偏置b是一维向量,每个输出图的特征图都对应一个偏置,??#而输出的特征图的个数由filter个数决定,因此用filter_shape[0]即number?of?filters来初始化??????????b_values?=?((filter_shape[0],),?dtype=)???????????=?(value=b_values,?borrow=True)????#将输入图像与filter卷积,??#卷积完没有加b再通过sigmoid,这里是一处简化。??????????conv_out?=?(??????????????input=input,??????????????filters=,??????????????filter_shape=filter_shape,??????????????image_shape=image_shape??????????)????#maxpooling,最大子采样过程??????????pooled_out?=?(??????????????input=conv_out,??????????????ds=poolsize,??????????????ignore_border=True??????????)????#加偏置,再通过tanh映射,得到卷积+子采样层的最终输出??#因为b是一维向量,这里用维度转换函数dimshuffle将其reshape。比方b是(10,),??#('x',?0,?'x',?'x'))将其reshape为(1,10,1,1)???????????=?(pooled_out?+?('x',?0,?'x',?'x'))??#卷积+采样层的参数???????????=?[,?]??定义隐含层HiddenLayer这个跟上一篇文章??DeepLearningtutorial〔3〕MLP多层感知机原理简介+代码详解?中的HiddenLayer是一致的,直接拿过来:[python]?viewplain?copy"""?注释:?这是定义隐藏层的类,首先明确:隐藏层的输入即input,输出即隐藏层的神经元个数。输入层与隐藏层是全连接的。?假设输入是n_in维的向量〔也可以说时n_in个神经元〕,隐藏层有n_out个神经元,那么因为是全连接,?一共有n_in*n_out个权重,故W大小时(n_in,n_out),n_in行n_out列,每一列对应隐藏层的每一个神经元的连接权重。?b是偏置,隐藏层有n_out个神经元,故b时n_out维向量。?rng即随机数生成器,,用于初始化W。?input训练模型所用到的所有输入,并不是MLP的输入层,MLP的输入层的神经元个数时n_in,而这里的参数input大小是〔n_example,n_in〕,每一行一个样本,即每一行作为MLP的输入层。?activation:激活函数,这里定义为函数tanh?"""??class?HiddenLayer(object):??????def?__init__(self,?rng,?input,?n_in,?n_out,?W=None,?b=None,???????????????????activation=):????????????=?input???#类HiddenLayer的input即所传递进来的input?????????????"""??????????注释:??????????代码要兼容GPU,那么必须使用?dtype=,??????????另外,W的初始化有个规那么:如果使用tanh函数,那么在-sqrt(6./(n_in+n_hidden))到sqrt(6./(n_in+n_hidden))之间均匀??????????抽取数值来初始化W,假设时sigmoid函数,那么以上再乘4倍。??????????"""???????????#如果W未初始化,那么根据上述方法初始化。???????????#参加这个判断的原因是:有时候我们可以用训练好的参数来初始化W,见我的上一篇文章。???????????if?W?is?None:??????????????W_values?=?(??????????????????(??????????????????????low=-(6.?/?(n_in?+?n_out)),??????????????????????high=(6.?/?(n_in?+?n_out)),??????????????????????size=(n_in,?n_out)??????????????????),??????????????????dtype=??????????????)??????????????if?activation?==?:??????????????????W_values?*=?4??????????????W?=?(value=W_values,?name='W',?borrow=True)?????????????if?b?is?None:??????????????b_values?=?((n_out,),?dtype=)??????????????b?=?(value=b_values,?name='b',?borrow=True)?????????????#用上面定义的W、b来初始化类HiddenLayer的W、b????????????=?W????????????=?b????????????#隐含层的输出???????????lin_output?=?(input,?)?+?????????????=?(??????????????lin_output?if?activation?is?None??????????????else?activation(lin_output)???????????)????????????#隐含层的参数????????????=?[,?]??定义分类器〔Softmax回归〕采用Softmax,这跟?DeepLearningtutorial〔1〕Softmax回归原理简介+代码详解?中的LogisticRegression是一样的,直接拿过来:[python]?viewplain?copy"""?定义分类层LogisticRegression,也即Softmax回归?在deeplearning?tutorial中,直接将LogisticRegression视为Softmax,?而我们所认识的二类别的逻辑回归就是当n_out=2时的LogisticRegression?"""??#参数说明:??#input,大小就是(n_example,n_in),其中n_example是一个batch的大小,??#因为我们训练时用的是Minibatch?SGD,因此input这样定义??#n_in,即上一层(隐含层)的输出??#n_out,输出的类别数???class?LogisticRegression(object):??????def?__init__(self,?input,?n_in,?n_out):????#W大小是n_in行n_out列,b为n_out维向量。即:每个输出对应W的一列以及b的一个元素。?????????????=?(??????????????value=(??????????????????(n_in,?n_out),??????????????????dtype=??????????????),??????????????name='W',??????????????borrow=True??????????)?????????????=?(??????????????value=(??????????????????(n_out,),??????????????????dtype=??????????????),??????????????name='b',??????????????borrow=True??????????)????#input是(n_example,n_in),W是〔n_in,n_out〕,点乘得到(n_example,n_out),加上偏置b,