您的位置:首页 > 理论基础 > 计算机网络

深度学习系列(十):从卷积计算到卷积神经网络CNN

2016-01-16 15:25 260 查看
前面已经介绍了深度学习的一个模型框架:自编码器,那么从本节后来再来简单介绍一下深度学习的另一个模型框架:卷积神经网络CNN,关于CNN可能大家听说过的不能在多了,网上资源众多,各路大神总结的也是无比完美,在这里就不在copy了,重要的地方直接直接贴出那些优秀的文章,这里旨在记录一下整个思路过程以及一些简单的认识以求完整。

首先贴一下网络上众多了讲解CNN的好资源吧:

(1)综述性的:

Deep Learning(深度学习)学习笔记整理系列之(七)

这篇推论非常好

CNN卷积神经网络推导和实现

一文读懂卷积神经网络

下面再简单总结下:

一)CNN来源

(1)来源1–需求需要

看过前面或者知道自编码器的可以发现,深层的自编码器其实已经可以实现类似于PCA甚至比PCA更好的特征提取了,而这个特征提取的过程也完全是机器自己完成的,我们根本不用管它具体提取的是什么特征,不像传统的设计特征提取(比如sift、hog等等人工设计的特征)那样,自编码的特征是自己找的,非常好。

但是我们也发现了一个问题,就是自编码网络其实和传统的神经网络差不多,不过深度多一点,但是本质上也是全连接的,就是下一层的每一个神经元与上一层的所有单元相连接着,像下面这个样子



我们知道前面我们处理的时手写体图像,每一个为28*28大小,也就是784输入向量,再加上很多隐含层,每一个隐含层又会有大量的单元连接,算一算在训练的时候得有多少参数呀,很多,所以呢,这种自编码式的深度学习虽然可以很好的学习特征,但是还是有限制的,那就是原始输入不能太大了,如果你来一个100*100=10000的图像就会受不了了,参数异常多。虽然不我们在前面也对自编码网络进行了各种优化(比如假如dropout,假如权值和限制、加入稀疏性限制等等)一系列举措,但是这在本质上还是没有减少网络参数众多这一问题,那么这就迫切需要一种方式来解决参数众多这一问题了,这就是CNN诞生的一个原因。

(2)来源2–视觉上的可行性

我们知道,就比如一副图像来说,像上面的那个网络,其实后一层的每个节点没必要和上一层的所有节点相连,如果后一层一个单元和前一层所有连接,变现出来就是下图的左边这个样子,其实呢他也可以用自编码器去找特征,就是参数非常多。而我们的图像在视觉机制上使什么样子的呢?就是图像上的某一部分的像素所表示的意义其实只和它周围的像素领域有关,比如下面这幅图假设爱因斯坦的眼睛中心这一个像素是不是只和它附近的像素有关而与其他地方的像素没有关系,这也是图像的空间特性,在很多地方,比如显著性分析、图像分割的时候,都会用到这种空间特性。那么我们何不将上面每个节点连接范围缩小呢?也就是下图的右边这个样子。这也叫做是局部感知。当然CNN减少参数的方式可不止这些。



二)关于卷积

所谓卷积,其实就是一种滤波方式。这在信号处理、图像处理上经常用到。最简单的在图像里面,一副图像和一个给定图像或者模版的进行卷积,卷积就是对应位置数据相乘然后再相加,比如像前面神经元与神经元全连接在一起的,假设他们是图像,对于其中一个隐含层的节点计算来说,拿出来其实就是一种卷积计算,像下面这样:



这是隐含层的全链接,那部分连接可能就不是I1~I9,可能只是I1~I3之类的与W1~W3卷积。

一个典型的部分连接其实可以等效为图像滤波一样,比如拉普拉斯滤波模版对图像滤波,像下面这样子:



比如对lena进行上述卷积操作(其实就是滤波)如下:

img = imread('lena.jpg');
img = rgb2gray(img);
% 图像大小:220*220
figure;subplot(1,2,1);imshow(img,[]);
% 拉普拉斯滤波模版 大小3*3
filter = [0 -1 0;-1 4 -1;0 -1 0];
%卷积计算
% 参数'valid'--对边缘不处理
% 得到的图像就是(220-3+1)=218*218的图像
img1 = convn(img,filter,'valid');
subplot(1,2,2);imshow(img1,[]);


得到如下所示:



这就是一个简单的与指定的小模版卷积结果,在CNN中,基本上都是这种与小模版进行的操作,就像上面给的爱因斯坦右边那个图那样子,不过在CNN中,区别于这里的是什么呢?那就是在CNN中,模版是我们事先不知道的(在这里我们人为设计了这个模版,也就是拉普拉斯模版),而是在训练的时候自己学习出来的,而且每一层我们可以学习很多个模版,就是对一副图进行好几次不同模版的滤波,得到好几个不同的卷积以后的图,在CNN中也叫做特征MAP。在cnn中我们需要设计的不过是模版的大小、模版的个数这些,至于是什么样的模版,就是靠自己学习而来的。

(三)关于卷积层

知道了图像与小模版的卷积概念后再来看看卷积层就很好理解了。

像上面,是对一副图像进行一个模版的卷积,那么我们可以定义好几个模版,分别依次卷积,像下面这样:



每一个卷积模版就好比是一个拉普拉斯模版那样子的,但是他们之间肯定是不一样的,不同的模版,不过模版中的值在CNN中就是需要学习的权值参数,而不是我们自己定的,其实我在想,在CNN的首层卷积层我们为什么不能自己定义一些比较好的模版,比如梯度检测算子、边缘检测算子等等,而在CNN的后面的卷积层让它自己学习好了。这样一副图像经过与好些个不同的模版卷积救护得到一些所谓的特征MAP了。在得到这些MAP后,我们可以发现,其实这些MAP本质上也是图像,那么我们对这些图像再进行后续的卷积如何呢?这就自然而然的引出了深层的卷积网络了。基于这样,我们在上面那个图后面在设计卷积模版,就会变成下面这样:



在这里呢我们假设卷积层C1下的每一个MAP又会衍生两个C2下的MAP,就是上面那样。但是在实际的CNN中,为了进一步减少参数,优化模型,通常早卷积层C1与C2之间还有一个降采样层S,什么意思呢?最简单就是对每一个C1下MAP进行缩小吧,比如缩小一倍,就是让C1下的每个MAP中每2*2的窗口取一个平均像素变成一个像素,这样就达到了缩小的目的了,这也就是降采样。像下面这样子。



之后可以再对C2进行降采样,在进行卷积,一直下去就是深度CNN了。

还有个问题就是,我们从S1到C2的时候,我们是选择S1中的一个map卷积得到下一个map,其实我们完全可以用S1中的两个甚至全部的3个MAP进行组合得到下一个MAP,组合方式可以是直接相加,比如说C2中每一个MAP都是S1中的所有MAP进行3个模版卷积然后相加而来的,那么此时的图就是下面这样子:



C2中的每一个MAP由S1中的3个MAP分别进行一个卷积,再把他们相加起来组合成一个MAP,注意的是从S1到C2的每一个卷积模版都是不一样的。那么想必前面一种可以看到,以前从S1到C2可能只要6个滤波模版,而现在呢需要18个模版,每个模版都是需要学习出来的。当然18个是最多的,如果后面每一个MAP不与前面的3个都相连接,而是2个或者1个,就不需要18个了。并且后一个MAP中每个与前面几个相连也不一定非得相同,比如C2中MAP1可能与S1的MAP1相连接,而C2中MAP2可能与S1的MAP1与MAP2相连接,等等。

好了看了这么多,再来看看手写体中的网络结构吧,就是这样子。详细的解释在上面的几个博客中都可以看到。



(四)关于CNN实验

对于CNN实验,前面谈及到的那个工具箱里面也集成了cnn代码。

DeepLearnToolbox

关于该工具箱的CNN讲解,下面几个讲的非常详细了,想详细研究的可以去看看

深度学习Matlab工具箱代码详解–deeptoolbox

Deep Learning论文笔记之(五)CNN卷积神经网络代码理解

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: