一、CNN 卷积神经网络原理简介http://blog.csdn.net/u012162613/article/details/43225445本文主要是详细地解读 CNN 的实现代码。如果你没学习过 CNN,在此推荐周晓艺师兄的博文:Deep Learning(深度学习)学习笔记整理系列之(七),以及 UFLDL 上的卷积特征提取、池化CNN 的最大特点就是稀疏连接(局部感受)和权值共享,如下面两图所示,左为稀疏连接,右为权值共享。稀疏连接和权值共享可以减少所要训练的参数,减少计算复杂度。至于 CNN 的结构,以经典的 LeNet5 来说明:这个图真是无处不在,一谈 CNN,必说 LeNet5,这图来自于这篇论文:Gradient-Based Learning Applied to DocumentRecognition,论文很长,第 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 用的是 rbfLeNet5 第二层并不是全连接的,本程序实现的是全连接另外,代码里将卷积层和子采用层合在一起,定义为“LeNetConvPoolLayer...