深度学习时代的计算机视觉算法
上QQ阅读APP看书,第一时间看更新

1.4.2 CNN结构简介

作为一种层次模型,CNN将原始图像或音频等数据作为输入,经过卷积、下采样(池化)、非线性激活函数映射等一系列操作,将高层语义信息逐层抽象提取出来,最终输出判别结果。这一系列操作都有相应的结构,如卷积操作对应卷积层,池化操作对应池化层等。CNN一般由卷积层和下采样(池化)层不断堆叠完成特征的抽象和提取,再经全连接层和输出层输出结果,典型的CNN结构如图1-2所示。

图1-2 典型CNN的结构

基于梯度下降法训练的多层神经网络可以学习从大量数据到目标类别的高维非线性的映射,因此比较适用于图像识别。传统的方法采用特征设计和分类器设计两个步骤,更具潜力的方法是让模型自己学习特征,而不是人工设计特征,但是直接将图像输入全连接层会存在一些问题。第一,参数数量太多,例如,图像尺寸为1000×1000,输入层就会有100万个神经元,如果隐藏层有100个神经元,那么从输入到隐藏层会有1亿个连接(也叫权重或参数)。第二,没有利用像素之间的位置信息,每个像素与其周围像素的联系是比较紧密的,与离得很远的像素的联系会很小。在图像中局部像素之间的联系较为紧密,而距离较远的像素联系相对较弱,因此每个神经元没必要对图像全局进行感知,只需要感知局部信息,然后在更高层将局部信息综合起来即可得到全局信息。卷积操作就是局部感受野的实现,并且卷积操作因为能够实现权值共享,所以也减少了参数量。第三,受网络层数限制,网络越深其特征表达能力越强,但较深的全连接神经网络难以成功训练。

相比于全连接,CNN的优点主要体现在:局部连接、空间权值共享和下采样。卷积核在特征图(第一层叫作原始图像)进行滑动计算,即卷积核只对前一层的局部区域进行连接,而不像全连接层那样对每个元素都进行连接。在滑动的过程中,卷积核采用的权值是共享的,即在每层中滑动到任何一处都是采用的同一组卷积核。下采样可减小卷积层的尺寸,通过求局部平均来降低特征图的分辨率,并且降低了输出对平移和形变的敏感度。

卷积层是CNN中的核心和基础部分,网络中大部分的计算量也是在卷积层中产生的。卷积层由多个特征图组成,每个特征图中又包含多个神经元,每个神经元通过卷积核与上一层特征图的局部区域构成连接。将CNN中第l层的输入特征图表示为一个三维张量,则可以用三元组(iljldl)来表示第il行、第jl列、第dl通道处的神经元,其中,0≤ilHl,0≤jlWl,0≤dlDl。经过第l层的处理后得到xl+1,为了后续表示方便,将其记为。为了便于说明卷积运算的过程,这里以单通道卷积核(dl=1)为例介绍二维场景的卷积操作。

假设CNN中第l层使用的是3×3的一个单通道卷积核,如图1-3所示,输入数据为5×5的矩阵。卷积步长设置为1,即每做一次卷积之后,卷积核移动一个元素的位置。

图1-3 二维场景下的输入数据与卷积核

第一次卷积操作从输入数据的(0,0)处元素开始,将卷积核中所有参数与对应位置的输入元素逐位相乘并求和的结果作为输出特征图(0,0)处的值,即完成计算1×1+2×0+3×1+6×0+7×1+8×0+9×1+8×0+7×1=1+3+7+9+7=27,如图1-4(a)所示。紧接着完成第二次卷积,卷积核向右进行步长为1的移动之后,进行同样的计算,整个过程如图1-4(b)~(d)所示,卷积核的移动规则为从左至右、自上到下,最终输出大小为3×3的特征图,作为下一层操作的输入。

图1-4 卷积过程示意图

在实际的操作中,输入一般为多通道数据(如RGB图像),某一层中使用的卷积核一般也不止一个。假设输入张量为,第l层共有D个卷积核,则输出为,其中Dl+1=D,即卷积核的个数决定了该层的输出(第l+1层的输入)特征图的通道数。形式化的卷积操作可表示为:

其中,(il+1jl+1)为卷积结果的位置坐标,满足:

式(1-14)中的指从卷积层中学习到的权重,对于不同位置的所有输入,该权重都是相同的,这便是卷积层所谓的“权值共享”特性。

此外,卷积操作中有3个重要的超参数(Hyper Parameters):卷积核大小、卷积步长(Stride)和零填充(Zero-Padding)数量。这三者和输入特征图的尺寸共同决定了输出特征图的尺寸。假设输入数据的空间形状是正方形,即高度和宽度相等,输入数据体尺寸为W,卷积层中神经元的感受野尺寸为F,步长为S,零填充数量为P,则输出数据体的空间尺寸如式(1-17)所示:

例如,假设输入(图像)数据的尺寸为7×7,滤波器大小为3×3,卷积步长为1,零填充数量为0,那么就能得到一个5×5的输出。如果步长为2,输出特征图的尺寸就是3×3。

池化层一般紧跟在卷积层之后,主要作用是再次提取重要信息,并通过降低特征图的空间分辨率获得具有空间不变性的特征。池化层中一般没有需要学习的参数,使用时仅需指定池化类型、池化核的大小和池化步长即可,因此池化操作也可以理解为一种实现固定功能的特殊卷积核。常用的池化操作有平均池化(Average Pooling)和最大池化(Max Pooling)两种。平均池化在每次操作时,将池化核覆盖区域中所有值的平均值作为池化结果,类似地,最大池化是指将池化核覆盖区域中所有值的最大值作为池化结果。将第l层的池化核表示为,则平均池化的数学表达为:

最大池化的数学表达为:

其中,0≤il+1Hl+1,0≤jl+1Wl+1,0≤dDl+1

为了便于理解,图1-5给出了池化核大小为2×2、步长为1的最大池化示意图。

图1-5 最大池化示意图

池化实际上是一种“降采样”操作,这与人类视觉系统对视觉输入物体进行降维和抽象的原理是类似的。目前,研究者普遍认为池化层的作用主要体现在保持特征不变、对特征进行降维、减少参数量、防止过拟合等方面。

全连接层一般置于网络的最后,起到“分类器”的作用。原始数据通过卷积操作、激活函数和池化操作被映射到隐层特征空间,全连接层则将学习到的特征映射到样本的标记空间。在分类任务中,全连接层的输出值经过激活函数(一般采用ReLU激活函数)后,输入Softmax分类器中进行分类。一般的CNN训练过程中,在全连接层通过损失函数计算输出的损失,然后将损失反向传回网络,再利用梯度下降法更新网络参数。

假设第l层为卷积层,则第l层中第j个特征图的计算式如式(1-20)所示:

其中,为第l-1层中的第i个特征图,为第l-1层的第i个特征图与第l层的第j个特征图之间的卷积核,*表示卷积操作,为第l-1层的偏置,f (·)为非线性的激活函数。经典的BP算法可以通过以下步骤完成。

步骤1:通过CNN对输入图像进行前向传播计算,得到的激活值。将式(1-20)重写为:

其中,l为当前层数,x为特征图,W为卷积核,b为偏置,f为激活函数。

步骤2:对所有l,初始化ΔWl=0,Δbl=0。

步骤3:假设输入数据共分为m类,即通过网络计算得到一个m维数据,然后求得样本标签与输出结果之间的均方误差,最后得到第n个样本的代价函数JWbxy)为:

其中,为第n个样本中第i个神经元所对应的期望值,为第n个样本中第i个神经元的输出结果。

为了求取单个样本的代价函数对参数的导数,引入灵敏度的概念,将灵敏度看作对偏置b的导数,然后通过这个灵敏度来求解对参数的导数。定义第l层的灵敏度为:

对于输出层nl,根据式(1-21)、式(1-22)可得到其灵敏度为:

对于l=nl-1,nl-2,…,2的各层灵敏度为:

然后对JWbxy)求偏导,完成参数的更新,代价函数JWbxy)对Wlbl的偏导计算式如下:

更新权重参数为:

其中,α为学习率。

BP算法流程如图1-6所示。

图1-6 BP算法流程