CNN卷积神经网络原理.doc

上传人:gs****r 文档编号:1487862 上传时间:2019-03-03 格式:DOC 页数:30 大小:262.03KB
下载 相关 举报
CNN卷积神经网络原理.doc_第1页
第1页 / 共30页
CNN卷积神经网络原理.doc_第2页
第2页 / 共30页
CNN卷积神经网络原理.doc_第3页
第3页 / 共30页
CNN卷积神经网络原理.doc_第4页
第4页 / 共30页
CNN卷积神经网络原理.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、一、CNN 卷积神经网络原理简介http:/ CNN 的实现代码。如果你没学习过CNN,在此推荐周晓艺师兄的博文: Deep Learning(深度学习)学习笔记整理系列之(七),以及 UFLDL 上的卷积特征提取、池化CNN 的最大特点就是稀疏连接(局部感受)和权值共享,如下面两图所示,左为稀疏连接,右为权值共享。稀疏连接和权值共享可以减少所要训练的参数,减少计算复杂度。至于 CNN 的结构,以经典的 LeNet5 来说明:这个图真是无处不在,一谈 CNN,必说 LeNet5,这图来自于这篇论文: Gradient-Based Learning Applied to Document Rec

2、ognition,论文很长,第 7 页那里开始讲 LeNet5 这个结构,建议看看那部分。我这里简单说一下,LeNet5 这张图从左到右,先是 input,这是输入层,即输入的图片。input-layer 到 C1 这部分就是一个卷积层(convolution 运算),C1 到 S2 是一个子采样层(pooling 运算),关于卷积和子采样的具体过程可以参考下图:然后,S2 到 C3 又是卷积,C3 到 S4 又是子采样,可以发现,卷积和子采样都是成对出现的,卷积后面一般跟着子采样。S4到 C5 之间是全连接的,这就相当于一个 MLP 的隐含层了(如果你不清楚 MLP,参考 DeepLearn

3、ing tutorial(3)MLP多层感知机原理简介+代码详解)。C5 到 F6 同样是全连接,也是相当于一个 MLP 的隐含层。最后从 F6 到输出 output,其实就是一个分类器,这一层就叫分类层。ok,CNN 的基本结构大概就是这样,由输入、卷积层、子采样层、全连接层、分类层、输出这些基本“构件”组成,一般根据具体的应用或者问题,去确定要多少卷积层和子采样层、采用什么分类器。当确定好了结构以后,如何求解层与层之间的连接参数?一般采用向前传播(FP)+向后传播(BP)的方法来训练。具体可参考上面给出的链接。二、CNN 卷积神经网络代码详细解读(基于python+theano)代码来自于

4、深度学习教程: Convolutional Neural Networks (LeNet),这个代码实现的是一个简化了的 LeNet5,具体如下: 没有实现 location-specific gain and bias parameters 用的是 maxpooling,而不是 average_pooling 分类器用的是 softmax,LeNet5 用的是 rbf LeNet5 第二层并不是全连接的,本程序实现的是全连接另外,代码里将卷积层和子采用层合在一起,定义为“LeNetConvPoolLayer“(卷积采样层),这好理解,因为它们总是成对出现。但是有个地方需要注意,代码中将卷积后

5、的输出直接作为子采样层的输入,而没有加偏置 b 再通过sigmoid 函数进行映射,即没有了下图中 fx 后面的 bx 以及sigmoid 映射,也即直接由 fx 得到 Cx。最后,代码中第一个卷积层用的卷积核有 20 个,第二个卷积层用 50 个,而不是上面那张 LeNet5 图中所示的 6 个和 16 个。了解了这些,下面看代码:(1)导入必要的模块python view plain copy1. import cPickle 2. import gzip 3. import os 4. import sys 5. import time 6. 7. import numpy 8. 9.

6、import theano 10.import theano.tensor as T 11.from theano.tensor.signal import downsample 12.from theano.tensor.nnet import conv (2 )定义 CNN 的基本“ 构件“CNN 的基本构件包括卷积采样层、隐含层、分类器,如下 定义 LeNetConvPoolLayer(卷积+采样层)见代码注释:python view plain copy1. “ 2. 卷积+下采样合成一个层 LeNetConvPoolLayer 3. rng:随机数生成器,用于初始化 W 4. inp

7、ut:4 维的向量,theano.tensor.dtensor4 5. filter_shape:(number of filters, num input feature maps,filter height, filter width) 6. image_shape:(batch size, num input feature maps,image height, image width) 7. poolsize: (#rows, #cols) 8. “ 9. class LeNetConvPoolLayer(object): 10. def _init_(self, rng, input

8、, filter_shape, image_shape, poolsize=(2, 2): 11. 12.#assert condition,condition 为 True,则继续往下执行,condition 为False,中断程序 13.#image_shape1和 filter_shape1都是 num input feature maps,它们必须是一样的。 14. assert image_shape1 = filter_shape1 15. self.input = input 16. 17.#每个隐层神经元(即像素)与上一层的连接数为num input feature maps

9、* filter height * filter width。 18.#可以用 numpy.prod(filter_shape1:)来求得 19. fan_in = numpy.prod(filter_shape1:) 20. 21.#lower layer 上每个神经元获得的梯度来自于:“num output feature maps * filter height * filter width“ /pooling size 22. fan_out = (filter_shape0 * numpy.prod(filter_shape2:) / 23. numpy.prod(poolsize)

10、 24. 25.#以上求得 fan_in、fan_out ,将它们代入公式,以此来随机初始化 W,W 就是线性卷积核 26. W_bound = numpy.sqrt(6. / (fan_in + fan_out) 27. self.W = theano.shared( 28. numpy.asarray( 29. rng.uniform(low=-W_bound, high=W_bound, size=filter_shape), 30. dtype=theano.config.floatX 31. ), 32. borrow=True 33. ) 34. 35.# the bias is

11、a 1D tensor - one bias per output feature map 36.#偏置 b是一维向量,每个输出图的特征图都对应一个偏置, 37.#而输出的特征图的个数由 filter 个数决定,因此用 filter_shape0即number of filters 来初始化 38. b_values = numpy.zeros(filter_shape0,), dtype=theano.config.floatX) 39. self.b = theano.shared(value=b_values, borrow=True) 40. 41.#将输入图像与 filter 卷积,

12、conv.conv2d 函数 42.#卷积完没有加 b再通过 sigmoid,这里是一处简化。 43. conv_out = conv.conv2d( 44. input=input, 45. filters=self.W, 46. filter_shape=filter_shape, 47. image_shape=image_shape 48. ) 49. 50.#maxpooling,最大子采样过程 51. pooled_out = downsample.max_pool_2d( 52. input=conv_out, 53. ds=poolsize, 54. ignore_border

13、=True 55. ) 56. 57.#加偏置,再通过 tanh 映射,得到卷积 +子采样层的最终输出 58.#因为 b是一维向量,这里用维度转换函数 dimshuffle 将其 reshape。比如 b是(10,) ,59.#则 b.dimshuffle(x, 0, x, x)将其 reshape 为(1,10,1,1) 60. self.output = T.tanh(pooled_out + self.b.dimshuffle(x, 0, x, x) 61.#卷积+ 采样层的参数 62. self.params = self.W, self.b 定义隐含层 HiddenLayer这个跟上

14、一篇文章 DeepLearning tutorial(3)MLP 多层感知机原理简介+代码详解中的 HiddenLayer 是一致的,直接拿过来:python view plain copy1. “ 2. 注释: 3. 这是定义隐藏层的类,首先明确:隐藏层的输入即 input,输出即隐藏层的神经元个数。输入层与隐藏层是全连接的。 4. 假设输入是 n_in 维的向量(也可以说时 n_in 个神经元),隐藏层有 n_out 个神经元,则因为是全连接, 5. 一共有 n_in*n_out 个权重,故 W大小时(n_in,n_out),n_in 行 n_out 列,每一列对应隐藏层的每一个神经元的连

15、接权重。 6. b是偏置,隐藏层有 n_out 个神经元,故 b时 n_out 维向量。 7. rng 即随机数生成器,numpy.random.RandomState,用于初始化 W。 8. input 训练模型所用到的所有输入,并不是 MLP 的输入层,MLP 的输入层的神经元个数时 n_in,而这里的参数 input 大小是(n_example,n_in ) ,每一行一个样本,即每一行作为 MLP 的输入层。 9. activation:激活函数,这里定义为函数 tanh 10.“ 11.class HiddenLayer(object): 12. def _init_(self, rn

16、g, input, n_in, n_out, W=None, b=None, 13. activation=T.tanh): 14. self.input = input #类 HiddenLayer 的 input 即所传递进来的input 15. 16. “ 17. 注释: 18. 代码要兼容 GPU,则必须使用 dtype=theano.config.floatX,并且定义为 theano.shared 19. 另外,W 的初始化有个规则:如果使用 tanh 函数,则在-sqrt(6./(n_in+n_hidden)到 sqrt(6./(n_in+n_hidden)之间均匀 20. 抽取

17、数值来初始化 W,若时 sigmoid 函数,则以上再乘 4倍。 21. “ 22. #如果 W未初始化,则根据上述方法初始化。 23. #加入这个判断的原因是:有时候我们可以用训练好的参数来初始化 W,见我的上一篇文章。 24. if W is None: 25. W_values = numpy.asarray( 26. rng.uniform( 27. low=-numpy.sqrt(6. / (n_in + n_out), 28. high=numpy.sqrt(6. / (n_in + n_out), 29. size=(n_in, n_out) 30. ), 31. dtype=t

18、heano.config.floatX 32. ) 33. if activation = theano.tensor.nnet.sigmoid: 34. W_values *= 4 35. W = theano.shared(value=W_values, name=W, borrow=True) 36. 37. if b is None: 38. b_values = numpy.zeros(n_out,), dtype=theano.config.floatX) 39. b = theano.shared(value=b_values, name=b, borrow=True) 40.

19、41. #用上面定义的 W、b 来初始化类 HiddenLayer 的 W、b 42. self.W = W 43. self.b = b 44. 45. #隐含层的输出 46. lin_output = T.dot(input, self.W) + self.b 47. self.output = ( 48. lin_output if activation is None 49. else activation(lin_output) 50. ) 51. 52. #隐含层的参数 53. self.params = self.W, self.b 定义分类器 (Softmax 回归)采用 So

20、ftmax,这跟 DeepLearning tutorial(1 )Softmax回归原理简介+代码详解中的 LogisticRegression 是一样的,直接拿过来:python view plain copy1. “ 2. 定义分类层 LogisticRegression,也即 Softmax 回归 3. 在 deeplearning tutorial 中,直接将 LogisticRegression 视为 Softmax, 4. 而我们所认识的二类别的逻辑回归就是当 n_out=2 时的 LogisticRegression 5. “ 6. #参数说明: 7. #input,大小就是(

21、n_example,n_in),其中 n_example 是一个 batch 的大小, 8. #因为我们训练时用的是 Minibatch SGD,因此 input 这样定义 9. #n_in,即上一层(隐含层)的输出 10.#n_out,输出的类别数 11.class LogisticRegression(object): 12. def _init_(self, input, n_in, n_out): 13. 14.#W 大小是 n_in 行 n_out 列,b 为 n_out 维向量。即:每个输出对应 W的一列以及 b的一个元素。 15. self.W = theano.shared(

22、16. value=numpy.zeros( 17. (n_in, n_out), 18. dtype=theano.config.floatX 19. ), 20. name=W, 21. borrow=True 22. ) 23. 24. self.b = theano.shared( 25. value=numpy.zeros( 26. (n_out,), 27. dtype=theano.config.floatX 28. ), 29. name=b, 30. borrow=True 31. ) 32. 33.#input 是(n_example,n_in),W 是(n_in,n_out), 点乘得到(n_example,n_out) ,加上偏置 b,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 企业管理资料库 > 生产营运

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。