没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
卷积神经网络全面解析之代码详解
本文介绍多层感知机算法,特别是详细解读其代码实现,基于 python
theano,代码来自:
Convolutional Neural Networks (LeNet)
。
一、CNN 卷积神经网络原理简介
要讲明白卷积神经网络,估计得长篇大论,网上有很多博文已经写得很
好了,所以本文就不重复了,如果你了解 CNN,那可以往下看,本文
主要是详细地解读 CNN 的实现代码。
CNN 的最大特点就是稀疏连接(局部感受)和权值共享,如下面两图
所示,左为稀疏连接,右为权值共享。稀疏连接和权值共享可以减少所
要训练的参数,减少计算复杂度。
至于 CNN 的结构,以经典的 LeNet5 来说明:
这个图真是无处不在,一谈 CNN,必说 LeNet5,这图来自于这篇论文:
Gradient-Based Learning Applied to Document Recognition
,论文很
长,第 7 页那里开始讲 LeNet5 这个结构,建议看看那部分。
我这里简单说一下,LeNet5 这张图从左到右,先是 input,这是输入
层,即输入的图片。input-layer 到 C1 这部分就是一个卷积层
(convolution 运算),C1 到 S2 是一个子采样层(pooling 运算),
关于卷积和子采样的具体过程可以参考下图:
然后,S2 到 C3 又是卷积,C3 到 S4 又是子采样,可以发现,卷积和
子采样都是成对出现的,卷积后面一般跟着子采样。S4 到 C5 之间是
全连接的,这就相当于一个 MLP 的隐含层了(如果你不清楚 MLP,参
考《
DeepLearning tutorial(3)MLP 多层感知机原理简介+代码详解
》)。
C5 到 F6 同样是全连接,也是相当于一个 MLP 的隐含层。最后从 F6
到输出 output,其实就是一个分类器,这一层就叫分类层。
ok,CNN 的基本结构大概就是这样,由输入、卷积层、子采样层、全
连接层、分类层、输出这些基本“构件”组成,一般根据具体的应用或者
问题,去确定要多少卷积层和子采样层、采用什么分类器。当确定好了
结构以后,如何求解层与层之间的连接参数?一般采用向前传播(FP)
+向后传播(BP)的方法来训练。具体可参考上面给出的链接。
二、CNN 卷积神经网络代码详细解读(基于 python+theano)
代码来自于深度学习教程:
Convolutional Neural Networks (LeNet)
,
这个代码实现的是一个简化了的 LeNet5,具体如下:
没有实现 location-specific gain and bias parameters
用的是 maxpooling,而不是 average_pooling
分类器用的是 softmax,LeNet5 用的是 rbf
LeNet5 第二层并不是全连接的,本程序实现的是全连接
另外,代码里将卷积层和子采用层合在一起,定义为
“LeNetConvPoolLayer“(卷积采样层),这好理解,因为它们总是成
对出现。但是有个地方需要注意,代码中将卷积后的输出直接作为子采
样层的输入,而没有加偏置 b 再通过 sigmoid 函数进行映射,即没有
了下图中 fx 后面的 bx 以及 sigmoid 映射,也即直接由 fx 得到 Cx。
最后,代码中第一个卷积层用的卷积核有 20 个,第二个卷积层用 50
个,而不是上面那张 LeNet5 图中所示的 6 个和 16 个。
了解了这些,下面看代码:
(1)导入必要的模块
import cPickle
import gzip
import os
import sys
import time
import numpy
import theano
import theano.tensor as T
from theano.tensor.signal import downsample
from theano.tensor.nnet import conv
(2)定义 CNN 的基本"构件"
CNN 的基本构件包括卷积采样层、隐含层、分类器,如下
定义 LeNetConvPoolLayer(卷积+采样层)
见代码注释:
"""
卷积+下采样合成一个层 LeNetConvPoolLayer
rng:随机数生成器,用于初始化 W
input:4 维的向量,theano.tensor.dtensor4
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 LeNetConvPoolLayer(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]
self.input = input
#每个隐层神经元(即像素)与上一层的连接数为 num input feature maps *
filter height * filter width。
#可以用 numpy.prod(filter_shape[1:])来求得
fan_in = numpy.prod(filter_shape[1:])
#lower layer 上每个神经元获得的梯度来自于:"num output feature maps *
filter height * filter width" /pooling size
fan_out = (filter_shape[0] * numpy.prod(filter_shape[2:]) /
numpy.prod(poolsize))
#以上求得 fan_in、fan_out ,将它们代入公式,以此来随机初始化 W,W 就是线
性卷积核
W_bound = numpy.sqrt(6. / (fan_in + fan_out))
self.W = theano.shared(
numpy.asarray(
剩余23页未读,继续阅读
资源评论
我是你的春哥!
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功