【DL-CV】神经网络的补充<前篇---后篇>【DL-CV】数据预处理&权重初始化
经典神经网络搞明白后,我们接下来看看他的变种,也是本系列的主角——卷积神经网络(Convolutional Neural Network/CNN)。
以往全连接层组成的神经网络有一个很气人的缺点就是对付大图像效果不好:图像尺寸一大,因为权重(形状上的)大小与图像尺寸有关系,参数量激增,导致效率低下。相比,卷积神经网络就没有这种烦人的特性了,他大大降低了网络中的参数量,而且能通过增加层数(加到数十层)提高性能,非常胜任图像识别的任务。
卷积神经网络
一个普通的卷积神经网络由各种层按顺序堆叠而成,这些层主要分三类:卷积层、池化层和全连接层。有时激活函数也算一层,它逐元素进行激活函数操作。而且为了更好的理解如何组装这个网络,我们先详细介绍这几种层的原理
卷积层
注:以下例子输入数据,输出数据,卷积核的截面都是正方形(宽度和高度相等)
有一张 32x32 的图像,我们保持输入图像数据的三维结构,则输入是一个 32x32x3 的三维数组。我们有一个5x5x3的卷积核(kernel)/滤波器(filter),让这个卷积核在宽度和高度上滑过整个数据空间,在每个位置,计算卷积核和数据的部分区域(两者重合的部分)的内积获得一个值,这个值加上偏置值b后经过激活函数作为输出的激活值。当卷积核完成这个操作后,会得到一个由激活值组成的二维的特征映射图(feature map,简称特征图)。
如上图左,如果步长为1(每次移动一个像素),会得到一张 28x28x1 的特征图,有28x28个神经元。关于神经元:
- 每个神经元只与输入数据的局部区域连接,该局部区域称为该神经元的感受野(receptive field)。感受野的大小(宽高)也就是卷积核的大小(宽高),通常为正方形(宽高相等);而卷积核的深度是和输入数据的深度相等的。上图的感受野大小是5x5。
- 同一个特征图上的神经元都公用一套权重,也就是那个卷积核。这称为参数共享,是卷积层的特性,卷积层中的神经元通过参数共享(而不像普通网络中每个神经元都有自己的一组参数)大大减低参数量。
在一个卷积层中,通常会有多个卷积核,每个卷积核都生成一个特征图,将这些特征图在深度方向堆叠起来就得到输出数据,作为下一个卷积层的输入或进入池化层。
卷积核的理解:
卷积核就是卷积层的参数,是我们要训练的参数。
笔者对卷积核一个直观的理解是,训练好的卷积核相当于特征提取器,他对整个图进行扫描,并在每个位置留下激活值(相当于该位置拥有某特征的可能性),这些激活值组成的特征图就相当于某特征分布的概率图。一个卷积核对应一种特征,使用多个卷积核提取图像的多个特征后,可以喂给下一层卷积层让下一层的卷积核提取更深一层的特征(浅层特征间的关系与组合),直到最后可以得到输入图像各种类别的可能性。
下面回到卷积层,注意到在卷积层中,有几个超参数影响着输出数据的尺寸(至于参数设定,文章最后):
- 卷积核的大小(F):影响着输出数据的宽高
- 卷积核数量(K):影响着输出数据的深度,卷积核数量与输出数据的深度在数值上相等
- 步长(S):影响着输出数据的宽高,步长越大,输出数据的宽高越小
- 零填充(P):零填充指在输入数据的宽和高两个维度上用零填充指定宽度。如输入数据大小为32x32x3,填充为2,则输入数据大小变为34x34x3。零填充很重要,如果只进行卷积而不使用零填充,那么输出数据的尺寸会不断缩小,导致特征丢失
知道这些参数后,根据输入数据的尺寸W1 ✖ H1 ✖ D1,我们有公式计算输出数据的尺寸W2 ✖ H2 ✖ D2:
- 宽:$W_2 = {(W_1-F+2P)\over S}+1$
- 高:$H_2 = {(H_1-F+2P)\over S}+1$
- 深度:$D_2=K$
- 其中$(W_1-F+2P)$与$S$、$(H_1-F+2P)$与$S$必须是整除关系,否则意味着卷积核会超出输入数据的边界(步长为一肯定没问题,大于一其他参数就要小心设置了)
- 每个卷积核有 F ✖ F ✖ D1个权重,K 个卷积核,卷积层共有F ✖ F ✖ D1 ✖ K 个权重和K 个偏置值
$$$$
卷积操作的矩阵实现
实际应用中,我们很少像上图一样在高维数组中迭代点积,因为这样正向反向传播都不好做,我们喜欢的还是惯用的矩阵操作。好消息是这是可行的,卷积运算本质上就是在卷积核和输入数据的局部区域间做点积,利用这一点我们可以把卷积操作转化为矩阵乘法:
- 把每个卷积核都展开成行向量(每个深度切片都展开成一行,拼起来获得一大行)作为卷积核矩阵的一行,获得矩阵W
- 把卷积操作的每个点积区域展开成列向量(每个深度切片都展开成一列,拼起来获得一大列)作为输入矩阵的一列,获得矩阵X
- 这样卷积操作就相当于X*W这个矩阵乘法了,输出矩阵X*W的每一行对应某个卷积核获得的特征图的展开(输出数据每个深度切片的展开)
这里只简单介绍实现,带图的详细说明请看此文章,很不错
池化层
在连续的卷积层之间会周期性地插入一个池化层,它的作用是逐渐降低数据体的空间尺寸(数据降采样),这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。
池化操作的对象是每一个特征图,也就是输入数据的每个深度切片。这里介绍常用的最大池化,对于每一个切片,会有一个扫描空间在宽度和高度上滑过整个切片,在每个位置选出空间内的最大值作为输出。如上图,输入4x4x4的数据,使用最大池化,空间大小2x2,步长为2,则输出2x2x4的数据。
根据输入数据的尺寸W1 ✖ H1 ✖ D1,空间大小F和步长S,我们有公式计算输出数据的尺寸W2 ✖ H2 ✖ D2:
- 宽:$W_2 = {(W_1-F)\over S}+1$
- 高:$H_2 = {(H_1-F)\over S}+1$
- 深度:$D_2=D_1$
- 池化层很少使用零填充
在实际使用中,最大池化通常采用$F=2,S=2$(无重叠,普通池化);较少用的有$F=3,S=2$(有重叠,重叠池化)
除了最大池化外,还有平均池化、随机池化、lp池化等,这里就不深入了,交给读者自行了解。在图像识别这一块,通常经验性的使用最大池化(性能好,反向传播也容易)。
另:一些学者认为可以不使用池化层,转而使用较大步长的卷积层来代替池化层实现数据尺寸的降低。一些发现也认为在训练一个良好的生成模型(如变化自编码器,生成性对抗网络)时,弃用池化层也是很重要的。这样看来的话,未来的卷积网络可能会向无池化层的方向发展
全连接层
卷积神经网络的最后一部分是全连接层组成的网络(也就是前面讲的普通的神经网络)。图像数据经过多层卷积层和池化层后,会得到足够小的特征数据,把特征数据的每个切片展开成向量并拼成一个大向量,便可作为全连接层的输入,最后输出类别得分。
全连接层转化为卷积层
任何全连接层都可以被转化为卷积层。只要把卷积核的尺寸改成和输入数据尺寸一致就能实现全连接了。
举个栗子,如上图,如果最后池化层输出数据大小为 4x4xD,我们要将其接入一个K = 4096 (神经元个数)的全连接层,则需要4096个尺寸为4x4xD的卷积核,卷积后的到1x1x4096的输出就对应着那个全连接层中的4096个神经元的值。如果第二个全连接层K=1000,则另需要1000个尺寸为1x1x4096的卷积核,卷积后得到1x1x1000的输出对应着第二个全连接层中的1000个神经元,如此类推。
这种转化参数量是没有改变的,看似没有好处,但是在下面的情况,这种转化能使计算高效化
现在有一张大尺寸图像,我们有一个浮窗,让浮窗在宽和高上滑过整张图片,在每个位置浮窗围住的子图像将作为卷积神经网络的输入,然后网络输出该子图像的评分数据。现在重点来了:
- 如果这是个原版的卷积神经网络(带全连接层),因为网络中的全连接层上改变了原先数据的维度,导致一次只能输出某个子图像的评分数据(向量)。整个过程就需要迭代多次网络才行
- 如果这是个改版的卷积神经网络(全连接层改成卷积层),因为浮窗行为与卷积层的共性,加之没有全连接层,数据会维持三维结构;只需一次正向传播便能得到所有评分数据
- 相比之下,改版的卷积神经网络更高效,它在每个子图像的计算中共享了计算资源。
另:这种带浮窗的设定,就是目标检测的实现方法,通常在一个大图像上,在不同的位置会有不同类别的物体,浮窗在每个位置都进行一次识别,就能在一张图中分辨出多个物体,所谓目标检测。
组装卷积神经网络
介绍完各种层的原理后,最后介绍如何用这些层组成一个完整的卷积神经网络,并解析各层参数的选用
通常卷积层有以下结构:
输入→→[ [卷积层→→激活函数层]*N →→池化层 ]*M →→[全连接层→→激活函数层]*K→→全连接层→→输出
池化层是可以不用的,全连接层可以转化为卷积层。*K、*N、*M 指重复若干次,其中N >=0,通常N<=3;M>=0;K>=0,通常K<3。N越大意味着池化前有更多的卷积层,这个思路适用于更大更深的网络,因为在执行具有破坏性的池化操作前,多重的卷积层可以从输入数据中学习到更多的复杂特征。
各层参数设定
输入层:图像的尺寸应该能被2整除多次,如32,64,96,224等。以方便池化操作
卷积层:
- 卷积核数量应该为2n ,如64,128,512......
- 卷积核尺寸推荐选较小的(如3x3,5x5),对应步长使用1。更大的卷积核尺寸(如7x7),通常只用在第一个面对原始图像的卷积层上
- 使用零填充,如果步长为1,填充大小 $P =(F-1)/2$ 便能维持输入输出的宽高一致
池化层:
- 通常使用最大池化,并使用2x2空间,步长为2($F=2,S=2$)
- 较少用的有3x3空间,步长为2,重叠池化($F=3,S=2$)
- 更大的空间极少用,池化效果太强,容易导致特征丢失
全连接层:就不多说了,就是普通的mlp
本文完:介绍了普通卷积神经网络的结构。在实际使用上,卷积神经网络因其不同的结构又细分成不同网络(如AlexNet,VGGNet,ResNet等),它们都是卷积神经网络的一种,这些以后再深入