浅析卷积神经网络的内部结构

提到卷积神经网络(CNN),很多人的印象可能还停留在黑箱子,输入数据然后输出结果的状态。里面超级多的参数、眼花缭乱的命名可能让你无法短时间理解CNN的真正内涵。这里推荐斯坦福大学的CS231n课程,知乎上有笔记的中文翻译。如果你需要更浅显、小白的解释,可以读读看本文。文章大部分理解都源自于CS321n卷积神经网络篇的笔记。

读完本文,你将从以下几个方面认识CNN:

 一、CNN概述

二、滤波器和感受野

滤波器

感受野

三、神经元的排列方式

步长

零填充

计算卷积层的空间维度

四、参数共享和卷积的由来

深度切片

参数共享

局部连接层

五、总结


一、CNN概述

CNN,卷积神经网络,和常规神经网络非常类似,拥有输入层、输出层以及中间一系列隐层。隐层可以是:卷积层、ReLu层、汇聚层(也叫池化层)和全连接层。各个隐层由神经元组成,每个神经元都含有参数,这些参数是具有学习能力的权重和偏差,用于內积运算。需要说明的是,卷积神经网络的输入是三维数据,从而各层也由三维的神经元组成。

如上图所示,左边表示普通的神经网络,右边是卷积神经网络。圆圈表示每个神经元,可以看到卷积神经网络的像素数据、神经元等都是三维排列的。

以对图像分类举例,输入一张图像,整个网络相当于一个可导的评分函数,输入是图像的像素,输出是不同类别的评分。网络中的隐层对输入数据做各种运算,且存在损失函数(也叫代价函数目标函数)来衡量我们对结果的不满意程度。如果你不知道损失函数,没关系,在这里不影响你的阅读,你可以选择在后续的学习中补充这方面的知识。现在,你只需要知道它的作用就可以了。

卷积神经网络为什么叫卷积神经网络呢?重点就在卷积二字。上面提到的卷积层是CNN的核心和灵魂。一切精巧的设计都在于此。

下面,我们就重点探索一下CNN中的卷积层

二、滤波器和感受野

滤波器

介绍滤波器之前,先考虑一个例子。

一张rgb输入图像的尺寸是300*300*3(长宽各300像素,3表示通道数),如果按照普通神经网络的思路,让每个像素值都和神经元全连接,一个神经元需要的参数将高达300*300*3=270,000个!网络中神经元的个数很多,参数的量很快就会快速增加到不可接受的地步,导致效率低下,网络过拟合。

于是呢,人们就考虑,既然输入数据是三维的,我们可不可以让神经元也三维排列?既然全连接情况下参数巨多,我们能不能让每个神经元只连接一部分输入数据的像素?只要神经元数目足够,肯定可以覆盖所有输入像素。

没错,人们就是这样做的。我们定义了滤波器,由一系列权重组成,仍然是三维的。每个滤波器在空间维度上的宽和高比较小,属于超参数,需要在迭代中慢慢找到最优解;在深度上自然需要和输入数据保持一致,才能和三维的输入数据做卷积。举个例子,输入数据300*300*3,一个典型的滤波器可以是5*5*3。想象滤波器在输入数据的空间维度上慢慢滑动,是不是最终覆盖了所有的像素?滤波器的权重和输入数据做內积,最终形成了一张二维的激活图。如果我们的卷积层深度为D_c,那么相当于形成D张激活图。这些图叠放在一起,就是最终的输出数据体的深度,即输出数据体维度为300*300*D。

再强调一遍,输入数据的深度决定了滤波器的深度。一个滤波器是权重的集合,每个神经元都拥有一个滤波器。这样,神经元和输入数据连接的时候,才能进行內积运算。

小结:

滤波器是权重的集合。

每个神经元都拥有一个滤波器,包含其用来內积运算的参数。

滤波器的深度和输入数据的深度保持一致,而空间上局部连接于输入数据。对于图像数据来说,滤波器的深度一定是3.

卷积层的深度决定了输出数据体的深度。

感受野

有了滤波器的概念,感受野再好理解不过了。简单的说,滤波器的空间维度 等于 感受野;直观的说,就是每个神经元在空间维度上能探测到的二维平面,即每个神经元与输入数据相连接的空间大小。

上图粉色区域是输入数据,蓝色是卷积层,圆圈表示神经元。老生常谈,都是三维排列。粉色区域中较深的平面就是该神经元的感受野。多说一句,沿着深度方向排列的神经元,感受野相同。这些沿着深度深度方向排列的神经元被称为深度列(图中蓝框中的小矩形)或纤维

三、神经元的排列方式

我们已经了解了每个神经元和输入数据体之间的连接方式,知道每个神经元的参数集合叫滤波器,滤波器和部分输入数据进行內积运算得到二维激活图。深度方向上的神经元个数决定了卷积层的输出数据体的深度。现在,我们来聊聊神经元的数量和排列方式如何确定。

步长

上面提到了滤波器将在输入数据体上进行滑动。滤波器在滑动时,必须指定固定的步长,即滤波器每次移动的像素。如果步长为2,表示滤波器每次滑动两个像素。容易得知,步长大于等于1的时候会使输出数据体在空间上变小。

零填充

零填充可以解决上面的问题,在输入数据体边缘用0进行填充,可以控制输出数据体的空间尺寸,从而保证输出数据体的空间尺寸和输入数据体相同。

计算卷积层的空间维度

考虑简单的情况,输入数据体长宽相等,神经元的感受野长宽也相等。这样,滤波器的滑动就可以在一维上进行抽象:

 

如上图左,紫色表示7*7的输入数据体(经过2个零填充),绿色表示3*3的滤波器,滤波器滑动步长为1,最终得到5*5的输出,由橘色表示。同理,右边最终得到3*3的输出。

假设输入数据体尺寸为W(长宽相等),神经元的感受野尺寸为F(长宽相等),步长为S,零填充的数量为P,可得输出数据体的空间尺寸:(W-F+2P)/S+1。

有兴趣的可以推算看看~

如果输入数据体长宽不等,只需要分别用上述公式计算即可。

总结一下,通过计算得到的神经元数量,他们的感受野是不是恰好能够覆盖(甚至可能还会重叠)所有的输入数据体的空间维度?于是,每个神经元利用自己的滤波器和输入数据体进行內积运算,最终在深度方向上排列成了输出数据体。

四、参数共享和卷积的由来

深度切片

深度切片是神经元在深度维度上的二维切片。举个例子,一个尺寸为55*55*96的卷积层,拥有96个深度切片,每个切片的维度是55*55. 考虑一袋96片装的切片面包(真多啊),深度切片就是一片片切好的面包,其长宽为55*55cm.

参数共享

前面我们提到,每个神经元都拥有一个滤波器,假设滤波器的尺寸为11*11*3,即一个滤波器的参数是363个。我们拥有的卷积层维度是55*55*96,即55*55*96=290,400个神经元。综合一下,所有的神经元将拥有290,400*363个参数,这无疑也是巨大的。

终于说到重点了!我们假设,如果一个滤波器找到的特征在空间位置(x,y)处,那么这个滤波器在另一个位置(x1,y1)处应该一样有效。基于这个假设,我们让一个深度切片上的所有神经元共享一个滤波器,也就是共享一套参数!

这样,上面的神经元将96个滤波器,共363*96个权重参数。显著降低了参数数量。

另外,共享参数看起来,是不是有些眼熟?没错,同一个深度切片上的神经元都拥有相同的滤波器,相当于将滤波器在输入数据体上以一定的步长滑动,做卷积运算!不同深度切片上的滤波器不同,因此滤波器的个数等于卷积层的深度。这就是卷积层的由来。

同样地,如果同一深度切片上的滤波器不同,可以理解为,滤波器在滑动的时候,每隔一个步长,其参数就发生了变化。

局部连接层

小小拓展一下:有时候,上面的参数共享假设没有意义,比如我们的输入图像是一些明确的中心结构的时候。比如人脸,我们希望不同的特征应该在图片的不同位置被学习到。这时候,就需要放松参数共享的限制,称为局部连接层

五、总结

讲到这里,我们对卷积层的大概构成和原理已经有了一定理解啦。现在我们对上面讲述做一个总结性的描述:

卷积层有四个超参数,分别为:滤波器的数量K(=输出数据体的深度=卷积层的深度),滤波器的空间尺寸F,步长S,零填充数量P。

假设输入数据体尺寸为W1*H1*D1,输出数据体尺寸为W2*H2*D2,则:

W2 = (W1 – F + 2P)/ S + 1

H2 = (H1 – F + 2P)/ S + 1

D2 = K

每个滤波器包含F*F*D1个权重,由于深度切片的参数共享,卷积层拥有F*F*D1*K个权重和K个偏置。(关于偏置,是一个滤波器卷积运算后的加和。在这里对卷积神经网络的理解影响不大,可以后续学习)

理解CNN,再使用CNN。

祝大家卷积愉快(笑)。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值