赞
踩
卷积层是卷积神经网络的核心, 大多数计算都是在卷积层中进行的。
首先介绍卷积神经网络的参数。 这些参数是由一些可学习的滤波器集合构成的, 每个滤波器在空间上( 宽度和高度) 都比较小, 但是深度和输入数据的深度保持一致。 举例来说, 卷积神经网络的第一层卷积一个典型的滤波器的尺寸可以是5×5×3( 宽和高都是5) , 或者是3×3×3( 宽和高都是3) , 这里的宽度和高度可以任意定义, 但是深度必须是3, 因为深度要和输入一致, 而输入的图片是3通道的。 在前向传播的时候, 让每个滤波器都在输入数据的宽度和高度上滑动( 卷积) , 然后计算整个滤波器和输入数据任意一处的内积。
当滤波器沿着输入数据的宽度和高度滑动时, 会生成一个二维的激活图, 激活图上的每个空间位置表示了原图片对于该滤波器的反应。 直观来看, 网络会让滤波器学习到当它看到某些类型的视觉特征的时候就激活, 具体的视觉特征可以是边界、 颜色、 轮廓、 甚至可以是网络更高层上的蜂巢状或者车轮状图案。
在每个卷积层上, 会有一整个集合的滤波器, 比如20个, 这样就会形成20张二维的、 不同的激活图, 将这些激活图在深度方向上层叠起来就形成了卷积层的输出。
如果用大脑和生物神经元做比喻, 那么输出的3D数据中的每个数据都可以看成是神经元的一个输出, 而该神经元只是观察输入数据中的一种特征, 并且和空间上左右两边的所有神经元共享参数( 因为这些输出都是使用同一个滤波器得到的结果) 。 下面介绍卷积神经网络中的神经元连接, 它们在空间中的排列, 以及它们参数共享的模式。
在处理图像这样高维度输入的时候, 让每个神经元都与它那一层中的所有神经元进行全连接是不现实的。 相反, 让每个神经元只与输入数据的一个局部区域连接是可行的, 为什么可以这样做呢? 其实这是因为图片特征的局部性, 所以只需要通过局部就能提取出相应的特征。
与神经元连接的空间大小叫做神经元的感受野( receptive field) , 它的大小是一个人为设置的超参数, 这其实就是滤波器的宽和高。 在深度方向上, 其大小总是和输入的深度相等。 最后强调一下, 对待空间维度( 宽和高) 和深度维度是不同的, 连接在空间上是局部的, 但是在深度上总是和输入的数据深度保持一致。
图4.6形象地展示了感受野在空间和深度上的大小, 左边表示输入的数据, 中间是感受野, 右边每个小圆点表示一个神经元。 下面举一个具体的例子来说明一下。 比如输入的数据尺寸为32×32×3, 如果感受野( 滤波器尺寸) 是5×5, 卷积层中每个神经元会有输入数据中5×5×3区域的权重, 一共5×5×3=75个权重。 这里再次强调感受野深度的大小必须是3, 和输入数据保持一致。 比如输入数据体尺寸是16×16×20, 感受野是3×3, 卷积层中每个神经元和输入数据体之间就有3×3×20=180个连接, 这里的深度必须是20, 和输入数据一致。
前面介绍了每个神经元只需要与输入数据的局部区域相连接, 但是没有介绍卷积层中神经元的数量和它们的排列方式、 输出深度、 滑动步长, 以及边界填充控制着卷积层的空间排布。
首先, 卷积层的输出深度是一个超参数, 它与使用的滤波器数量一致, 每种滤波器所做的就是在输入数据中寻找一种特征。 比如说输入一张原始图片, 卷积层输出的深度是20, 这说明有20个滤波器对数据进行处理, 每种滤波器寻找一种特征进行激活。
其次, 在滑动滤波器的时候, 必须指定步长。 比如步长为1, 说明滤波器每次移动1个像素点。 当步长为2的时候, 滤波器会滑动2个像素点。 滑动的操作会使得输出的数据在空间上变得更小。
最后介绍边界填充, 可以将输入数据用0在边界进行填充, 这里将0填充的尺寸作为一个超参数, 有一个好处就是, 可以控制输出数据在空间上的尺寸, 最常用来保证输入和输出在空间上尺寸一致。输出的尺寸到底是多少呢? 其实可以用一个公式来计算, 就是, 其中W 表示输入的数据大小, F 表示卷积层中神经元的感受野尺寸, S表示步长, P 表示边界填充0的数量。 比如输入是7×7, 滤波器是3×3, 步长是1, 填充的数量是0, 那么根据公式, 就能得到 , 即输出的空间大小是5×5, 如果步长是2,那么 , 输出的空间大小就是3×3。 可以用图4.7所示的这个一维的例子来具体说明。
右上角表示神经网络的权重, 其中输入数据的大小为5, 感受野的大小为3; 左边表示滑动步长为1, 且填充也为1; 右边表示滑动步长为2, 填充为1。
从上面的例子中, 我们看到输入的维度是5, 输出的维度也是5。之所以如此, 是因为感受野是3, 并且使用了1的零填充。 如果不使用零填充, 那么输出数据的维度也就只有3, 因为 。 一般来说, 当步长S=1时, 零填充的值为P= , 这样就能够保证输入的数据和输出的数据具有相同的空间尺寸。
通过上面的公式我们知道步长的选择是有所限制的, 举例来说,当输入尺寸W=10的时候, 如果不使用零填充, 即P=0, 滤波器尺寸F=3, 这样步长S=2就行不通, 因为 , 结果不是一个整数, 这就说明神经元不能整齐对称地滑过输入数据体, 这样的超参数设置是无效的, 使用PyTorch的时候就会报错, 可以使用零填充让设置变得合理。 在后面卷积神经网络的结构设计中, 需要合理地设计网络的尺寸, 使得所有维度都能够正常工作, 这件事并没有看上去那么容易。
在卷积层使用参数共享可以有效地减少参数的个数, 这样之所以能够行得通, 是因为之前介绍的特征的相同性, 也就是说相同的滤波器能够检测出不同位置的相同特征。 比如说一个卷积层的输出是20×20×32, 那么其中神经元的个数就是20×20×32=12800, 如果窗口大小是3×3, 而输入的数据体深度是10, 那么每个神经元就有3×3×10=900个参数, 这样合起来就有12800×900=11520000个参数,单单一层卷积就有这么多参数, 这样运算速度显然是特别慢的。
根据之前介绍的, 一个滤波器检测出一个空间位置( x1, y1) 处的特征, 那么也能够有效检测出( x2, y2) 位置的特征, 所以就可以用相同的滤波器来检测相同的特征, 基于这个假设, 我们就能够有效减少参数个数。 比如上面这个例子, 一共有32个滤波器, 这使得输出体的厚度是32, 每个滤波器的参数为3×3×10=900, 总共的参数就有32×900=28800个, 极大减少了参数的个数。
由参数共享我们知道输出体数据在深度切片上所有的权重都使用同一个权重向量, 那么卷积层在向前传播的过程中, 每个深度切片都可以看成是神经元的权重对输入数据体做卷积, 这也就是为什么要把这些3D的权重集合称为滤波器, 或者卷积核。
需要注意的是, 参数共享之所以能够有效, 是因为一个特征在不同位置的表现是相同的, 比如一个滤波器检测到了水平边界这个特征, 那么这个特征具有平移不变性, 所以在其他位置也能够检测出
来。 但是有时候这样的假设可能是没有意义的, 特别是当卷积神经网络的输入图像呈现的是一些明确的中心结构的时候, 希望在图片的不同位置学习到不同的特征。 一个具体的例子就是人脸识别, 人脸一般位于图片的中心, 我们希望不同的特征能够在不同的位置被学习到,比如眼睛特征或者头发特征, 正是由于这些特征在不同的地方, 才能够对人脸进行识别。
上一部分介绍完卷积神经网络中最核心的内容——卷积层, 下面来介绍一下第二种层结构——池化层。
通常会在卷积层之间周期性插入一个池化层, 其作用是逐渐降低数据体的空间尺寸, 这样就能够减少网络中参数的数量, 减少计算资源耗费, 同时也能够有效地控制过拟合。
下面先来介绍到底什么是池化层。 池化层和卷积层一样也有一个空间窗口, 通常采用的是取这些窗口中的最大值作为输出结果,然后不断滑动窗口, 对输入数据体每一个深度切片单独处理, 减少它的空间尺寸, 如图4.8所示。
从图4.8能够看出池化层能够有效降低数据体空间的大小, 图4.9形象地说明了窗口大小是2, 滑动步长是2的最大值池化是如何计算
的: 每次都从2×2的窗口中选择最大的数值, 同时每次滑动2个步长进入新的窗口。
池化层之所以有效, 是因为之前介绍的图片特征具有不变性, 也就是通过下采样不会丢失图片拥有的特征, 由于这种特性, 我们可以将图片缩小再进行卷积处理, 这样能够大大降低卷积运算的时间。最常用的池化层形式是尺寸为2×2的窗口, 滑动步长为2, 对图像进行下采样, 将其中75%的激活信息都丢掉, 选择其中最大的保留下来, 这其实是因为我们希望能够更加激活里面的数值大的特征, 去除一些噪声信息。
池化层有一些和卷积层类似的性质。
( 1) 输入数据体的尺寸是W1 ×H1 ×D1。
( 2) 有两个需要设置的超参数, 空间大小F 和滑动步长S。
( 3) 输出数据体的尺寸是W2×H2×D2, 其中。
( 4) 对输入进行固定函数的计算, 没有参数引入。
( 5) 池化层中很少引入零填充。
在实际中, 有两种方式: 一种是F=3, S=2, 这种池化有重叠;另外更常用的一种是F=2, S=2, 一般来说应该谨慎使用比较大的池化窗口, 以免对网络有破坏性。
除了最大值池化之外, 还有一些其他的池化函数, 比如平均池化, 或者L2范数池化。 在实际中证明, 在卷积层之间引入最大池化的效果是最好的, 而平均池化一般放在卷积神经网络的最后一层。
全连接层 每个神经元与前一层所有的神经元全部连接, 而卷积神经网络只和输入数据中的一个局部区域连接, 并且输出的神经元每个深度切片共享参数。一般经过了一系列的卷积层和池化层之后, 提取出图片的特征图, 比如说特征图的大小是3×3×512, 这个时候, 将特征图中的所有神经元变成全连接层的样子, 直观上也就是将一个3D的立方体重新排列, 变成一个全连接层, 里面有3×3×512=4608个神经元, 再经过几个隐藏层, 最后输出结果。在这个过程中为了防止过拟合会引入Dropout。 最近的研究表明, 在进入全连接层之前, 使用全局平均池化能够有效地降低过拟合。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。