88
99本节的所有代码,可以在[ 这里] ( http://deeplearning.net/tutorial/code/convolutional_mlp.py ) 下载,还有[ 3狼月亮图] ( https://raw.githubusercontent.com/lisa-lab/DeepLearningTutorials/master/doc/images/3wolfmoon.jpg ) 。
1010
11- ### 动机
11+ ## 动机
1212卷积神经网络是多层感知机的生物灵感变种。从Hubel和Wiesel先前对猫的视觉皮层的研究,我们知道视皮层中含有细胞的复杂分布。这些细胞只对小的视觉子区域敏感,称为` 感受野 ` 。这些子区域平铺来覆盖整个视场。这些细胞表现为输入图像空间的局部滤波器,非常适合检测自然图像中的强空间局部相关性。
1313
1414此外,两类基础细胞类型被定义:` 简单细胞 ` 使用它们的感受野,最大限度的响应特定的棱状图案。` 复杂细胞 ` 有更大的感受野,可以局部不变的确定图案精确位置。动物视觉皮层是现存的最强大的视觉处理系统,很显然,我们需要去模仿它的行为。因此,许多类神经模型在文献中出现,包括[ NeoCognitron] ( http://deeplearning.net/tutorial/references.html#fukushima ) ,[ HMAX] ( http://deeplearning.net/tutorial/references.html#serre07 ) 和[ LeNet-5] ( http://deeplearning.net/tutorial/references.html#lecun98 ) ,这是本教程需要着重讲解的。
1515
16- ### 稀疏连接
16+ ## 稀疏连接
1717卷积神经网络通过在相邻层的神经元之间实施局部连接模式来检测局部空间相关性。换句话说就是,第m层的隐藏单元的输入来自第m-1层单元的子集,单元拥有空间上的感受野连接。我们可以通过如下的图来表示:
1818
1919![ sparse_connectivity] ( /images/4_sparse_con_1.png )
2222
2323然而,就像上面展示的,将这些层叠加起来去形成(非线性)滤波器,就可以变得越来越全局化。举例而言,第m+1层的单元可以编码一个宽度为5的非线性特征。
2424
25- ### 权值共享
25+ ## 权值共享
2626此外,在CNNs中,每一只滤波器共享同一组权值,这样该滤波器就可以形成一个特征映射(feaature map)。梯度下降算法在小改动后可以学习这种共享参数。这个被共享权值的梯度就是被共享的参数的梯度的简单求和。
2727
2828复制单元使得特征可以无视其在视觉野中的位置而被检测到。此外,权值共享增加了学习效率,减少了需要被学习的自由参数的数目。这样的设定,使得CNNs在视觉问题上有更好的泛化性。
2929
30- ### 细节和注解
30+ ## 细节和注解
3131一个特征映射是由一个函数在整个图像的某一子区域重复使用来获得的,换句话说,就是通过线性滤波器来卷积输入图像,加上偏置后,再输入到非线性函数。如果我们定义第k个特征映射是为h_k,滤波器有W_k,b_k定义,则特征映射可以被表现为如下形式:
3232
3333![ h_k(i,j)] ( /images/4_detail_notation_1.png )
4545把它们都放一起就是,W_k_l(i,j),表示第m层的第k个特征映射,在第m-1层的l个特征映射的(i,j)参考坐标的连接权值。
4646
4747
48- ### 卷积操作
48+ ## 卷积操作
4949卷积操作是Theano实现卷积层的主要消耗。卷积操作通过` theano.tensor.signal.conv2d ` ,它包括两个输入符号:
5050
5151* 与输入的minibatch有关的4维张量,尺寸包括如下:[ mini-batch的大小,输入特征映射的数目,图像高度,图像宽度] 。
@@ -141,7 +141,7 @@ pylab.show()
141141
142142注意我们使用了与MLP相同得权值初始化方案。权值在一个范围为[ -1/fan-in, 1/fan-in] 的均匀分布中随机取样,fan-in是一个隐单元的输入数。对MLP,它是下一层单元的数目。对CNNs,我不得不需要去考虑到输入特征映射的数目和感受野的大小。
143143
144- ### 最大池化
144+ ## 最大池化
145145卷积神经网络另一个重大的概念是最大池化,一个非线性的降采样形式。最大池化就是将输入图像分割为一系列不重叠的矩阵,然后对每个子区域,输出最大值。
146146
147147最大池化在视觉中是有用的,由如下2个原因:
@@ -197,7 +197,7 @@ With ignore_border set to False:
197197注意,与其他Theano代码相比,` max_pool_2d ` 操作有点特殊。它需要缩减因子` ds ` (长度维2的tuple,班汉图像长度和宽度的缩减因子)在图构建的时候被告知。这在未来可能会发生改变。
198198
199199
200- ### 整个模型
200+ ## 整个模型
201201稀疏性、卷积层和最大池化时LeNet系列模型的核心。而准确的模型细节有很大的差异,下图显示了一个LeNet模型。
202202
203203![ full_model] ( /images/4_full_model_1.png )
@@ -395,7 +395,7 @@ class LeNetConvPoolLayer(object):
395395```
396396我们把进行实际训练和early-stopping代码取出了。因为它和MLP中是一样的。有兴趣的读者,可以阅读教程开头的源代码。
397397
398- ### 运行代码
398+ ## 运行代码
399399在一台Core i7-2600K CPU clocked at 3.40GHz上,我们使用floatX=float32,获得如下的输出:
400400
401401```
@@ -422,11 +422,11 @@ The code for file convolutional_mlp.py ran for 32.52m
422422```
423423可以观察到不同实验下验证误差和测试误差的不同,这是由不同硬件的取整结构不同造成的。可以忽略。
424424
425- ### 技巧
426- #### 超参的选择
425+ ## 技巧
426+ ### 超参的选择
427427卷积神经网络的训练相比与标准的MLP是相当困难的,因为它添加了更多的超参数。当我们在应用学习率和正则化的规则下,下面的方法也需要在优化CNNs被考虑:
428428
429- ##### 滤波器的数量
429+ #### 滤波器的数量
430430当选择每层滤波器数量的时候,需要记住计算单卷积层的活性比传统的MLP会更加昂贵。
431431
432432假设第l-1层包含K_ (l-1)个特征映射和M* N个像素点(例如,位置数乘以特征映射数),然后第l层有K_ (l)个滤波器,尺寸为m* n。那么计算一个特征映射(在(M-m)* (N-n)个像素位置应用每个m* n大小的滤波器)将消耗(M-m)* (N-n)* m* n* K_ (l-1)的计算量。然后总共要计算K_l次。如果不是所有的特征只与前一层的所有特征相连,那么事情就变得更加复杂啦。
@@ -436,15 +436,15 @@ The code for file convolutional_mlp.py ran for 32.52m
436436因为特征映射的尺寸会随着深度的增加而减小,靠近输入层的层将趋向于有更少的滤波器,而更高的层有更多的滤波器。事实上,为了平衡每一层的计算量,特征数和图像位置数的乘积在层的传递过程中都是基本一致的。为了保护输入信息,我们需要保证总的激活数量(特征映射数* 像素位置数)在层间传递的时候是至于减少(当然我们在做监督学习的时候当然是希望它减小的)。特征映射的数量直接控制整个容量,同时它依赖于可用样例的数目和任务的复杂度。
437437
438438
439- ##### 滤波器的尺寸
439+ #### 滤波器的尺寸
440440通常在每个文献中滤波器的尺寸都有很大的不同,它常常是基于数据库的。MNIST在第一层的最好结果是5* 5层滤波器。当自然图像(每维有几百个像素)趋向于使用更大的滤波器,例如12* 12,15* 15。
441441
442442因此这个技巧事实上是去寻找正确等级的“粒度”,以便对给定的数据集去形成合适范围内的抽象。
443443
444- ##### 最大池化的尺寸
444+ #### 最大池化的尺寸
445445经典的是2* 2,或者没有最大池化。非常大的图可以在较低的层使用4* 4的池化。但是需要记住的是,池化在通过16个因子减少信号维度的同时,也可能导致信号细节的大量丢失。
446446
447- ##### 技巧
447+ #### 技巧
448448假如你想要在新的数据集上采用这个模型,下面的一些小技巧可能能让你获得更好的结果:
449449* 白化(whitening)数据(例如,使用主成分分析)
450450* 衰减每次迭代的学习速率。
0 commit comments