georgesale 2019-06-28
【DL-CV】神经网络的补充<前篇---后篇>【DL-CV】数据预处理&权重初始化
经典神经网络搞明白后,我们接下来看看他的变种,也是本系列的主角——卷积神经网络(Convolutional Neural Network/CNN)。
以往全连接层组成的神经网络有一个很气人的缺点就是对付大图像效果不好:图像尺寸一大,因为权重(形状上的)大小与图像尺寸有关系,参数量激增,导致效率低下。相比,卷积神经网络就没有这种烦人的特性了,他大大降低了网络中的参数量,而且能通过增加层数(加到数十层)提高性能,非常胜任图像识别的任务。
一个普通的卷积神经网络由各种层按顺序堆叠而成,这些层主要分三类:卷积层、池化层和全连接层。有时激活函数也算一层,它逐元素进行激活函数操作。而且为了更好的理解如何组装这个网络,我们先详细介绍这几种层的原理
注:以下例子输入数据,输出数据,卷积核的截面都是正方形(宽度和高度相等)
有一张 32x32 的图像,我们保持输入图像数据的三维结构,则输入是一个 32x32x3 的三维数组。我们有一个5x5x3的卷积核(kernel)/滤波器(filter),让这个卷积核在宽度和高度上滑过整个数据空间,在每个位置,计算卷积核和数据的部分区域(两者重合的部分)的内积获得一个值,这个值加上偏置值b后经过激活函数作为输出的激活值。当卷积核完成这个操作后,会得到一个由激活值组成的二维的特征映射图(feature map,简称特征图)。
如上图左,如果步长为1(每次移动一个像素),会得到一张 28x28x1 的特征图,有28x28个神经元。关于神经元:
在一个卷积层中,通常会有多个卷积核,每个卷积核都生成一个特征图,将这些特征图在深度方向堆叠起来就得到输出数据,作为下一个卷积层的输入或进入池化层。
卷积核的理解:
卷积核就是卷积层的参数,是我们要训练的参数。
笔者对卷积核一个直观的理解是,训练好的卷积核相当于特征提取器,他对整个图进行扫描,并在每个位置留下激活值(相当于该位置拥有某特征的可能性),这些激活值组成的特征图就相当于某特征分布的概率图。一个卷积核对应一种特征,使用多个卷积核提取图像的多个特征后,可以喂给下一层卷积层让下一层的卷积核提取更深一层的特征(浅层特征间的关系与组合),直到最后可以得到输入图像各种类别的可能性。
下面回到卷积层,注意到在卷积层中,有几个超参数影响着输出数据的尺寸(至于参数设定,文章最后):
知道这些参数后,根据输入数据的尺寸W1 ✖ H1 ✖ D1,我们有公式计算输出数据的尺寸W2 ✖ H2 ✖ D2:
$$$$
实际应用中,我们很少像上图一样在高维数组中迭代点积,因为这样正向反向传播都不好做,我们喜欢的还是惯用的矩阵操作。好消息是这是可行的,卷积运算本质上就是在卷积核和输入数据的局部区域间做点积,利用这一点我们可以把卷积操作转化为矩阵乘法:
这里只简单介绍实现,带图的详细说明请看此文章,很不错
在连续的卷积层之间会周期性地插入一个池化层,它的作用是逐渐降低数据体的空间尺寸(数据降采样),这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。
池化操作的对象是每一个特征图,也就是输入数据的每个深度切片。这里介绍常用的最大池化,对于每一个切片,会有一个扫描空间在宽度和高度上滑过整个切片,在每个位置选出空间内的最大值作为输出。如上图,输入4x4x4的数据,使用最大池化,空间大小2x2,步长为2,则输出2x2x4的数据。
根据输入数据的尺寸W1 ✖ H1 ✖ D1,空间大小F和步长S,我们有公式计算输出数据的尺寸W2 ✖ H2 ✖ D2:
在实际使用中,最大池化通常采用$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等。以方便池化操作
卷积层:
池化层:
全连接层:就不多说了,就是普通的mlp
本文完:介绍了普通卷积神经网络的结构。在实际使用上,卷积神经网络因其不同的结构又细分成不同网络(如AlexNet,VGGNet,ResNet等),它们都是卷积神经网络的一种,这些以后再深入