2017CS231n李飞飞深度视觉识别笔记(五)——卷积神经网络

第五讲 卷积神经网络

课时1 历史

    在上一章中,我们讨论了神经网络的有关知识以及线性评分函数的运行实例,通过堆叠线性层来实现完整的神经网络。

    接下来,我们将讨论卷积神经网络,以下是1998年LeCun应用反向传播和基于梯度的学习方法来训练神经网络;

    1960年,Widrow和Hoff发明了Adaline和Madaline,首次尝试把线性层叠加,整合为多层感知器网络,不过此时反向传播和其他训练方法并未出现;

    1986年,Rumelhart首次提出了反向传播算法,从这里开始,链式法则、更新规则以及一些方程逐渐产生;

    2006年,Geoff.Hinton与Ruslan的一篇论文中表明深度神经网络不仅可以训练还可以高效的训练,但是这时的神经网络必须要谨慎的初始化才能进行反向传播;

    2012年,神经网络取得了惊人的成果,深度神经网络的狂潮由此爆发,Geoff.Hinton小组利用深度神经网络进行声学建模和语音识别,然后是图像识别,GNN树立了ImageNet图像分类任务的标杆且大幅度的降低了误差;

    直到现在,卷积神经网络的应用已经到处都在,比如人脸识别、视频分类、姿态识别、路标识别以及图像描述等。

 

课时2 卷积与池化

    接下来将探讨卷积神经网络是如何工作的,同样先从函数的角度了解他的工作原理。

    对于全连接层而言,一张三维图像,将所有像素展开得到一个3072维的向量,把向量和权值矩阵相乘,如下图的例子:

    这里用10行数据与这个3072维的输入进行点积运算,然后得到一个数字,就是该神经元的值,这个例子中应该有10个这样的值。

    对于卷积层而言,它和全连接的主要差别是它可以保全空间结构,例如下图中就可以保持图片的结构,这个三维输入的结构:

    然后将5*5*3的卷积核在整个图像上滑动,计算出每一个空间定位时的点积结果。首先,采用卷积核总是会将输入量扩展至整个卷积层,所以它们都是一个很小的空间区域,它们通常会遍历所有通道。就像下图中将卷积核的每个位置元素和与之对应图像区域的像素值相乘,经过运算后得到的点积,结果是

    问题:当做点积时,是否会把5*5*3这个块转成一个向量?

    答:可以这么做,原理是一样的,将对应的像素向量展开,就可以做点积。

    接下来继续讨论如何滑动卷积核并遍历所有空间位置,我们将这个卷积核从左上方边角处开始,让卷积核遍历输入的所有像素点,在每一个位置都进行点积运算,以最简单的方式一个像素一个像素的滑动,持续相应的操作并相应的填满输出激活映射。

    我们可以按照同样的方法使用多个卷积核进行计算,将会得到多层的激活映射:

    简单描述一下在卷积神经网络中是如何使用这些卷积层的,ConvNet基本上是由多个卷积层组成的一个序列,它们依次堆叠,然后用激活函数对其进行逐一处理,比如说一个ReLU激活函数;然后将得到一些比如Conv和ReLU的东西以及一些池化层;

    完成了对一个堆叠的卷积层的学习之后,前面几层的卷积核一般代表了一些低阶的图像特征,比如说一些边缘特征;而对于中间层的卷积核,可以看到一些更复杂的图像特征,比如边角和斑点等;而后面的几层,会看到更加丰富的内容。

    问题:增加深度的出发点是什么?

    答:一种出于架构设计层面的考虑。

    卷积神经网络整体上来看就是输入一个图片,让它通过很多层,比如卷积层、非线性层、池化层,经过这些处理后,最终得到卷积层输出,然后就可以用全连接层连接所有的卷积层输出,用其获得一个最终的分值函数。

    接下来用一个例子来理解这个过程,还是用刚才前面提到的这个32*32*3的图像,用5*5*3的卷积核在图像上滑过:

    那么如何来准确地产生这个28*28的激活映射的呢?

    假设实际上用的7*7的输入(此处假设只是为了方便),有一个3*3的卷积核,接下来将卷积核从左向右滑动(每一滑动1个步长),最后将得到一个5*5的输出,因为在水平和垂直方向都是5个空间位置。

    现在如果让每次滑动的步长为2,那么最终得到一个3*3的输出;如果采用步长为3,就不能和图像完美的拟合,这样是行不通的,不会这样去做卷积。因为它会导致不对称的输出。输出的计算公式和结果如下图:

    但是如果使用0来填补(可以帮助获得全部尺寸的输出),得到:

    此时滑动的步长为1时,可以得到7*7的输出矩阵,因此此时N=9;同样的,滑动的步长为2时,得到4*4的输出矩阵;滑动步长为3时,则得到3*3的输出矩阵。

    如果处理的图像是多层叠在一起的,会发现如果不做零填充或者其他形式的填充,输出图像的尺寸会迅速减小,这并不好,因为这会损失很多的信息,意味着只能使用很少的值来表示原始图像。

    例题:如果输入32*32*3的图像,使用10个5*5的卷积核,步长为1,填充宽度为2,输出图像的尺寸是多大?在这层中参数有多少个?

    答:尺寸是32*32*10,F是32,每个边上加入了宽度为2的填充,所以通过计算(32+2*2-5)/1+1=32,所以对于每个卷积核,输出都是32*32,总共10个卷积核,得到10个激活映射,总的输出大小为32*32*10。

    每个卷积核有5*5*3+1(偏差项)=76个参数,10个卷积核总共760个参数。

    总结卷积层:

    (1)有特定维数的输入W1*H1*D1;

    (2)各种参数:卷积核大小,步长大小,0填充大小。

 

课时3 视觉之外的神经网络

    现在换一个角度,从大脑神经元的角度分析一个卷积层。

    我们将看到,在每个位置,会取一个卷积核与图像的特定部分之间的一个点积,从而得到一个数值结果;基于同样的想法,取输入值和权值矩阵W之间的点积,然后得到一个输出值;但是它们的主要区别在于神经元具有局部的连接性,所以不关注所输入图片的全部而是关注图像空间的一个局部区域。

    假设有一个5*5的卷积核,也可以称为5*5的接收区域,也就是输入区域,对一个5*5的滤波器,都将让他们划过整个图像空间,但是这些卷积核都具有相同的权重和参数。

    卷积核的数量就是所谓的深度,假设有5层的卷积核,那么从这个网格中就得到了一个5*28*28尺寸的输出,这些不同的卷积核作用于图像的相同区域当中。另一个需要提到的方面是每隔几个卷积层就有一个池化层夹在中间:

    对于这些列的理解:

    一开始有一个图像,经过卷积层,得到的是每一个滑过输入图像的卷积核的激活映射。把激活映射送进ReLU得到一些这样的值,在池化层得到的数据就是前面ReLU层输出,这就做了降采样,取出所有卷积核对应位置上的最大值,每一层的输出都是一个积累的结果。这样得到的全连接层把所有的信息聚合到一起,得到一组分类的分值,每个值代表复合的复杂概念的受激程度。

    这些池化层所要做的是要让所生成的表示更小且更容易控制,且降低采样率处理,比如进行一个空间的降采样,然而并不在深度方向上的池化处理,只在平面上做:

    最常见的方法是最大池化法,例如下面的例子中,池化层也有一个卷积核的大小,如果使用一个步长为2的2*2的滤波器,让这个卷积核滑过整个输入部分,取滑过区域中的最大值。

    问题:是否通常设定步长,使它们不会互相重叠?

    答:对于池化层来说是的,通常是让它们没有任何重叠,可以通过降采样的处理,对一个给定区域避免重叠的处理。

    问题:为什么最大池化层要好于像均值化之类的方式?

    答:如果要做检测识别之类的任务,最大值池化是更直观的,不管从图片里找光线还是其他类似的信息,用一个最大值来激活它。

    问题:既然池化和步长滑动都是在降采样,能不能只滑动步长而不池化,或者只池化而不滑动步长呢?

    答:实际上在实践中,在一些神经网络的结构中,已经开始在用滑动来替代池化去做降采样。

    池化层的典型设置是2*2的卷积核加步长2或者3*3加步长3。

    下面是训练卷积网络的演示程序,可以点进去用它在CIFAR-10上训练卷积网络,这样可以对激活映射有更多的了解。

    总结:

    (1)卷积网络的工作原理,怎么把卷积核池化层堆叠起来,最后怎么与全连接层结合;

    (2)小尺寸卷积核和更深的网络结构是一个趋势;

    (3)完全弃用池化和全连接层,而只保留卷积层形成深层卷积网络也是一个趋势;

    (4)典型的结构:卷积ReLU重复N次,每次做一个池化,如此反复,最后来到全连接ReLU层,最后用softmax得到你的类别分数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值