深度卷积神经网络

所有内容整理自个人学习,来源于网上、书籍以及个人的思考,来源太多太杂不做一一的说明,敬请原谅。

全连接的邻接关系的深度神经网络,即,网络中的神经元与相邻的层上的每个神经元均连接(如下图1)。这种神经网络在MNIST手写数字数据集的训练和测试数据下可以取得98%的成绩,已经相当不错了。稍微解释一下,输入层为输入图像的每一个像素点,将其光照强度作为对应输入神经元的值。利用反向传播和梯度下降方法来训练网络的权重和偏置,最后网络输出我们希望的分类。 但是值得推敲的一点是,全连接的深度神经网络用到了像素点的光照强度,但是却忽略了图片的空间结构,即它平等的对待相距很远和彼此接近的输入像素。同时也注意到,全连接的深度神经网络的训练参数量十分庞大,考虑一个输入1000 * 1000像素的图片(一百万像素,现在已经不能算大图了),输入层有1000 * 1000=100万节点。假设第一个隐藏层有100个节点(这个数量并不多),那么仅这一层就有(1000 * 1000+1) * 100=1亿参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此它的扩展性很差。最后,网络层数越多神经网络的表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。这里总结一下,深度全连接神经网络的缺点有三:

  • 没有考虑图片的空间结构
  • 训练参数量巨大
  • 网络层数限制了网络的表达能力

而卷积神经网络的出现,恰恰解决了以上难题。深度卷积神经网络使用一个特别适用于图像分类的网络结构,使得网络训练的参数减少、深度增加并且利用了图像的空间结构。其思路有三:

  • 局部感受野(local receptive fields): 每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连;
  • 权值共享(shared weights): 一组连接可以共享同一个权重,而不是每个连接有一个不同的权重;
  • 下采样(pooling): 可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。

卷积层

在全连接的神经网络中,输入被描述成纵向排列的神经元。但是在一个卷积神经网络中,把输入看成是一个 m * n 的方形排列的神经元更有帮助,每一个神经元的值为每个像素的值(黑白图片为光照强度,彩色图片为RGB数组)。

和通常一样,输入神经元与第一个隐藏层相连。但是卷积神经网络不会把每一个输入神经元连接到每一个隐藏神经元,反倒是将输入神经元进行小的,局部区域的连接(如下图2)。

卷积的含义如图3所示。中间部分就是一个卷积核,也叫一个滤波器(filter),即带有一组固定权重的神经元。多个滤波器叠加便成了卷积层。左边是原始的输入数据,右边是输出的新的二维数据

在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据(如上图3所示)。这个过程中,有这么几个参数:

  • 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
  • 步长stride:决定滑动多少步可以到边缘。
  • 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。

卷积层

在图3的动图中,可以看到:

  • 两个神经元,即depth=2,意味着有两个滤波器。
  • 数据窗口每次移动两个步长取3*3的局部数据,即stride=2。
  • zero-padding=1。 然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。

如果初看上图3,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情: 左边是输入(773中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道),中间部分是两个不同的滤波器Filter w0、Filter w1,最右边则是两个不同的输出。随着左边数据窗口的平移滑动,滤波器Filter w0 和 Filter w1对不同的局部数据进行卷积计算。

值得一提的是:

  • 左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,眼镜负担不起,而且一下子接受全世界所有信息,大脑也接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。
  • 与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。不同人的双眼看同一个局部信息所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器,就像不同的双眼,不同的人有着不同的反馈结果。

卷积层的计算 首先,分解一下上述动图,如下图5: 接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似$$wx + b$$,W对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示: 1*0 + 1*0 + (-1*0) + (-1*0) + 0*0 + 1*1 + (-1*0) + (-1*0) + 0*1 + (-1*0) + 0*0 + (-1*0) + 0*0 + 0*1 + (-1*1) + 1*0 + (-1*0) + 0*2 + 0*0 + 1*0 + 0*0 + 1*0 + 0*2 + 1*0 + 0*0 + (-1*0) + 1*0

  • 1 = 1

以此类推,然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果。最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。


In [ ]: