目前为止我已经完整地学完了三个机器学习教程:包括“Stanford CS229”,"Machine Learning on Coursrea" 和 "Stanford UFLDL",卷积神经网络是其中最抽象的概念。git
维基百科对卷积的数学定义为:
github
因为卷积经常使用与信号处理,不少人基于“输入->系统->响应”这一模型来解释卷积的物理意义,这里转载一个很是通俗的版本:网络
好比说你的老板命令你干活,你却到楼下打台球去了,后来被老板发现,他很是气愤,扇了你一巴掌(注意,这就是输入信号,脉冲),因而你的脸上会渐渐地鼓起来一个包,你的脸就是一个系统,而鼓起来的包就是你的脸对巴掌的响应,好,这样就和信号系统创建起来意义对应的联系。下面还须要一些假设来保证论证的严谨:假定你的脸是线性时不变系统,也就是说,不管何时老板打你一巴掌,打在你脸的同一位置,你的脸上老是会在相同的时间间隔内鼓起来一个相同高度的包,而且假定以鼓起来的包的大小做为系统输出。好了,下面能够进入核心内容——卷积了!app
若是你天天都到地下去打台球,那么老板天天都要扇你一巴掌,不过当老板打你一巴掌后,你5分钟就消肿了,因此时间长了,你甚至就适应这种生活了……若是有一天,老板忍无可忍,以0.5秒的间隔开始不间断的扇你的过程,这样问题就来了,第一次扇你鼓起来的包还没消肿,第二个巴掌就来了,你脸上的包就可能鼓起来两倍高,老板不断扇你,脉冲不断做用在你脸上,效果不断叠加了,这样这些效果就能够求和了,结果就是你脸上的包的高度随时间变化的一个函数了(注意理解);若是老板再狠一点,频率愈来愈高,以致于你都辨别不清时间间隔了,那么,求和就变成积分了。能够这样理解,在这个过程当中的某一固定的时刻,你的脸上的包的鼓起程度和什么有关呢?和以前每次打你都有关!可是各次的贡献是不同的,越早打的巴掌,贡献越小,因此这就是说,某一时刻的输出是以前不少次输入乘以各自的衰减系数以后的叠加而造成某一点的输出,而后再把不一样时刻的输出点放在一块儿,造成一个函数,这就是卷积,卷积以后的函数就是你脸上的包的大小随时间变化的函数。原本你的包几分钟就能够消肿,但是若是连续打,几个小时也消不了肿了,这难道不是一种平滑过程么?反映到剑桥大学的公式上,f(a)就是第a个巴掌,g(x-a)就是第a个巴掌在x时刻的做用程度,乘起来再叠加就ok了,你们说是否是这个道理呢?我想这个例子已经很是形象了,你对卷积有了更加具体深入的了解了吗?机器学习
这是一些尝试解释卷积的文章:函数
http://www.guokr.com/post/342476/ post
http://blog.csdn.net/yeeman/article/details/6325693 学习
https://zh.wikipedia.org/wiki/%E5%8D%B7%E7%A7%AF this
而在图像处理中一般使用离散形式的卷积,在下一节中介绍。
编码
假设有一个稀疏自编码器 SAE,训练使用的是 3×3 的小图。将 SAE 用做深度网络的隐藏层时,它依然只接受 3×3 的数据做为输入,且假设这个隐藏层有 k 个单元(每一个单元也被称为一个卷积核 - Convolution Kernel,由对应的权值向量 W 和 b 来体现)。
每一个隐藏单元的输入是用本身的权值向量 W 与 3×3 的小图作内积,再与截距项相加获得的:
假如深度网络的输入是 5×5 的大图,SAE 要从中提取特征,必须将 5×5 的大图分解成若干 3×3 的小图并分别提取它们的特征。分解方法就是:从大图的 (1, 1)、(1, 2)、(1, 3)、... 、(3, 3)等 9 个点开始分别做为小图的左上角起点,依次截取 9 张带有重合区域的小图,而后分别提取这 9 张小图的特征:
因此,每一个隐藏单元将有 9 个输入,不一样于以前的 1 个。而后将全部输入分别导入激活函数计算相应的输出,卷积特征提取的工做就完成了。
对于本例,隐藏层所提取的特征共有 9×k 个;更通常化地,若是大图尺寸是 r×c,小图尺寸是 a×b,那么所提取特征的个数为:
卷积特征提取利用了天然图像的统计平稳性(Stationary):
天然图像有其固有特性,也就是说,图像的一部分的统计特性与其余部分是同样的。这也意味着咱们在这一部分学习的特征也能用在另外一部分上,因此对于这个图像上的全部位置,咱们都能使用一样的学习特征。
在完成卷积特征提取以后,对于每个隐藏单元,它都提取到 (r-a+1)×(c-b+1)个特征,把它看作一个矩阵,并在这个矩阵上划分出几个不重合的区域,而后在每一个区域上计算该区域内特征的均值或最大值,而后用这些均值或最大值参与后续的训练,这个过程就是【池化】。
显著减小了参数数量
池化单元具备平移不变性 (translation invariant)
有一个 12×12 的 feature map (隐藏层的一个单元提取到的卷积特征矩阵),池化区域的大小为 6×6,那么池化后,feature map 的维度变为 2×2。
假设原 feature map 中灰色元素的值为 1,白色元素的值为 0。若是采用 max pooling,那么池化后左上角窗口的值为 1。若是将图像向右平移一个像素:
池化后左上角窗口的值仍是 1。若是将图像缩小:
池化后左上角窗口的值依然是 1。
一般咱们认为图像通过有限的平移、缩放、旋转,不该改变其识别结果,这就要求通过平移、缩放、旋转的图片所提取的特征与原图所提取的特征相同或类似,所以分类器才能把它们识别成同一类。
比较主流的池化方式有以下几种:
通常池化(General Pooling): max pooling 和 average pooling
如今已经知道了 max pooling 与 average pooling 的几何意义,还有一个问题须要思考:它们分别适用于那些场合?在不一样的场合下,它们的表现有什么不同?为何不同?
网络上有人这样区分 max pooling 和 average pooling:
“average对背景保留更好,max对纹理提取更好”。
限于篇幅以及个人理解还不深,就不展开讨论了,若是之后须要,我会深刻研究一下。
重叠池化(Overlapping Pooling)
重叠池化的相邻池化窗口之间会有重叠区域。
空间金字塔池化(Spatial Pyramid Pooling)
空间金字塔池化拓展了卷积神经网络的实用性,使它可以以任意尺寸的图片做为输入。
下面列出一些研究池化的论文:
http://yann.lecun.com/exdb/publis/pdf/boureau-icml-10.pdf
http://yann.lecun.com/exdb/publis/pdf/boureau-cvpr-10.pdf
有 m 张彩色天然图片拿来训练一个神经网络,使它可以对图片中的物体作分类。训练过程能够大体分为如下几步:
从图片库中随机裁剪出相同尺寸的小图若干张,用来训练一个稀疏自编码器 C1;
以 C1 做为第一个卷积层,从原图中作卷积特征提取;
在 C1 下游添加一个池化层 S1,对 C1 所提取的特征作池化计算;
若是须要提取更加抽象的特征,在 S1 以后添加卷积层 C2,C2 是一个使用 S1 的数据进行训练的稀疏自编码器;
在 C2 下游添加一个池化层 S2,若是须要提取进一步抽象的特征,重复添加卷积层与池化层便可;
以最后一个池化层的输出做为数据训练分类器。
In this exercise you will use the features you learned on 8x8 patches sampled from images from the STL-10 dataset in the earlier exercise on linear decoders for classifying images from a reduced STL-10 dataset applying convolution and pooling. The reduced STL-10 dataset comprises 64x64 images from 4 classes (airplane, car, cat, dog).
此次做业依赖上一次“linear decoders”做业的代码,使用的数据是 STL-10 的一个子集,用来识别四种图像:飞机、汽车、猫和狗。
代码地址,因为 GIthub 有文件大小限制,因此此次没有上传数据文件。
Pooling 的代码比较简单,因此这里把计算卷积的代码详细注释后贴出来:
cnnConvolve.m
运行结果(识别的正确率):
使用 average pooling:
使用 max pooling: