这是卷积神经网络笔记第四篇,完整的笔记目录可以点击这里查看。
在卷积神经网络(Convolutional Neural Networks, CNNs / ConvNets)中,卷积核是指具有一定宽度和高度,且深度与图像深度一致的卷积块,由它所构成的网络层就称之为卷积层。在图像处理过程中,卷积层在空间平面中的连接是局部的(沿宽度和高度),但在深度上是全局的,即图像有多少个层,那么卷积核就有多少深度。下面,我们介绍一下CNN的三个主要超参数depth、stride、zero-padding:
- 输出量的深度(depth)是一个超参数:它对应于我们想要使用的过滤器(filter)的数量,每个过滤器都从输入中学习不同的东西。例如,如果第一个卷积层将原始图像作为输入,则沿深度维度的不同神经元可在存在各种定向边缘或色块的情况下激活。我们将一组平面坐标一样,但所在的深度层不同的神经元称为深度列(depth column,有些人也更喜欢术语fibre)。
- 其次,我们必须指定卷积滑动的步长(stride)。当步长为1时,我们一次移动一个像素。当步长为2时,filter一次跳2个像素。这将在空间上产生较小的输出量。
- 有时我们需要在输入图像的边界周围填充零,这称为zero-padding,是一个超参数。零填充的一个很好的特性是,它允许我们控制输出的空间尺度大小。
在介绍怎么通过输入计算输出之前,先介绍一个概念:感受野(receptive field)。它被定义为卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小,可以参考这篇博客。
下面让我们来计算输出体积的空间大小。记输入体积大小W
、Conv层神经元的感受野宽度F
、步长S
和边界上的零填充量P
。则输出的层大小为(W−F+2P)/S+1
。例如,对于7x7输入和3x3滤波器,步幅1和pad 0,我们将得到5x5的输出((7-3+0)/1+1=5)。用步幅2我们可以得到3x3的输出((7-3+0)/2+1=3)。让我们再看一个图形示例:
在上图的这个例子中,只有一个空间维度(x轴方向)。一个神经元的感受野大小为F=3,输入大小为W=5,并且存在P=1的零填充。神经元权重是[1,0,-1](显示在最右边),它的偏差是零。所有黄色神经元共享这些权重(参见参数共享)。左:神经元以S=1的步幅在输入上滑动,输出大小为(5 - 3 + 2)/1+1 = 5。右图:神经元使用S=2的步幅,输出大小为(5 - 3 + 2)/2+1 = 3。请注意,不能使用步幅S=3,因为它不能刚好“卷完整个数据。因为根据计算式,(5 - 3 + 2) = 4不能被3整除。
在设置这几个超参数时,需要注意以下两点:
- 使用零填充。在上图左这个例子中,输入维度是5,输出维度是相等的,也是5。因为我们的感受野是3,我们使用了大小为1的零填充。如果没有使用零填充,那么输出的维度将只有3。通常,当步幅为S=1时,将零填充设置为P=(F−1)/2可确保输入和输出在空间上具有相同的大小。以这种方式使用零填充是非常常见的。
- 对步长的限制。空间排列超参数之间具有相互约束。例如,当输入的大小为W=10时,不使用零填充P=0,并且过滤器大小为F=3,则不可能使用跨距S=2,因为 (W−F+2P)/S+1=(10−3+0)/2+1=4.5,即不是整数,这表明神经元在输入上不合适。因此,这个超参数的设置被认为是无效的,ConvNet库会抛出一个异常。解决办法是:或者对缺的部分进行零填充,或者裁剪输入,等等。适当地调整ConvNet的大小以使所有的维度都能“工作”是一个真正令人头痛的问题,使用零填充和一些设计准则将显著地减轻这一问题。
最后,对卷积神经网络的输入输出及超参数进行一个总结:
- 接受大小为W1×H1×D1的输入
- 需要四个超参数:
- filter的数量K
- filter的宽度F
- 步长S
- padding宽度P
- 产生大小为W2×H2×D2的输出,其中:
- W2=(W1−F+2P)/S+1
- H2=(H1−F+2P)/S+1(即宽度和高度通过对称性相等计算)
- D2=K
- 通过参数共享,每个filter包含F⋅F⋅D1个权值,总共(F⋅F⋅D1)⋅K个权值和K个偏差。
- 在输出中,第d个深度切片(大小为W2×H2)的结果是对输入按照步长S执行第d个filter卷积,然后加上第d个偏移的结果。
*本博客翻译总结自CS231n课程作业网站,该网站需要翻墙才能访问。