文档介绍:一、CNN卷积神经网络原理介绍
本文关键是具体地解读CNN实现代码。假如你没学习过CNN,在此推荐周晓艺师兄博文:Deep Learning(深度学整理系列之(七),和UFLDL上卷积特征提取、池化
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)导入必需模块
[python] view plain copy
import cPickle  
import gzip  
import os  
import sys  
import time  
  
import numpy  
  
import theano  
import  as T  
from  import downsample  
from  import conv  
(2)定义CNN基础"构件"
CNN基础构件包含卷积采样层、隐含层、分类器,以下
定义LeNetConvPoolLayer(卷积+采样层)
见代码注释:
[python] view plain copy
""" 
卷积+下采样合成一个层LeNetConvPoolLayer 
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 LeNetCon