目前为止我已经完整地学完了三个机器学习教程:包括“Stanford CS229”,”Machine Learning on Coursrea” 和 “Stanford UFLDL”,卷积神经网络是其中最抽象的概念。
维基百科对卷积的数学定义为:
由于卷积常用与信号处理,很多人基于“输入->系统->响应”这一模型来解释卷积的物理意义,这里转载一个非常通俗的版本:
这是一些尝试解释卷积的文章:
而在图像处理中通常使用离散形式的卷积,在下一节中介绍。
假设有一个稀疏自编码器 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)个特征,把它看做一个矩阵,并在这个矩阵上划分出几个不重合的区域,然后在每个区域上计算该区域内特征的均值或最大值,然后用这些均值或最大值参与后续的训练,这个过程就是【池化】。
假设原 feature map 中灰色元素的值为 1,白色元素的值为 0。如果采用 max pooling,那么池化后左上角窗口的值为 1。如果将图像向右平移一个像素:
池化后左上角窗口的值还是 1。如果将图像缩小:
池化后左上角窗口的值依然是 1。
通常我们认为图像经过有限的平移、缩放、旋转,不应改变其识别结果,这就要求经过平移、缩放、旋转的图片所提取的特征与原图所提取的特征相同或相似,因此分类器才能把它们识别成同一类。
比较主流的池化方式有如下几种:
网络上有人这样区分 max pooling 和 average pooling:
“average对背景保留更好,max对纹理提取更好”。
限于篇幅以及我的理解还不深,就不展开讨论了,如果以后需要,我会深入研究一下。
{aa9aa}
{aa8aa}
{aa7aa}
有 m 张彩色自然图片拿来训练一个神经网络,使它能够对图片中的物体做分类。训练过程可以大致分为以下几步:
这次作业依赖上一次“linear decoders”作业的代码,使用的数据是 STL-10 的一个子集,用来识别四种图像:飞机、汽车、猫和狗。
,由于 GIthub 有文件大小限制,所以这次没有上传数据文件。
Pooling 的代码比较简单,所以这里把计算卷积的代码详细注释后贴出来:
cnnConvolve.m
运行结果(识别的正确率):
来源: http://blog.jobbole.com/110692/