深度学习之模型设计:核心算法与案例实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 卷积神经网络基础

语音识别、图像处理、自然语言处理领域的发展多半得益于卷积神经网络的成功。卷积神经网络虽然在20世纪90年代就已经被广泛使用,但直到互联网海量数据诞生和计算机硬件水平快速提高后,它的潜能才被真正激发。

2.3.1 卷积操作

从数学上讲,卷积就是一种运算。(x*w)(t)称为xw的卷积,其连续的定义为

离散的定义为

若将一幅二维图像x作为输入,使用一个二维的卷积核w,则有

可以看出,一个卷积包含两个输入,如上面的xwx表示输入,w表示卷积核,即kernel。

卷积在工程和数学上有非常多的应用,在信号处理领域,任意一个线性系统的输出,都是输入信号和系统激励函数的卷积。本书关注的是数字图像处理领域,所以卷积操作都指图像领域的二维卷积。

一个二维卷积的实例如图2.4所示,卷积就是在图像上滑动,取与卷积核大小相等的区域,逐像素做乘法然后相加。

图2.4 二维卷积的实例

在图2.4中,原始图像大小是5×5,卷积核大小是3×3。首先卷积核与原始图像左上角3×3对应位置的元素相乘求和,得到的数值作为结果矩阵第1行第1列的元素值,然后卷积核向右移动1个单位(步长为1),与原始图像前3行第2、3、4列所对应位置的元素分别相乘并求和,得到的数值作为结果矩阵第1行第2列的元素值,以此类推。

注意,这里不区分卷积和互相关,它们的区别只在于权重算子是否进行了翻转,但在机器学习中,其是否翻转并不影响算法学习效果。

2.3.2 反卷积操作

通常卷积会造成分辨率降低。如图2.5所示,上方2×2的矩阵是输出,下方4×4的矩阵是输入,在一个卷积核大小为3×3的矩阵的作用下,经过步长为1的卷积后,4×4的输入矩阵变为了2×2大小的输出矩阵。

反卷积则与之相反,它也是通过在输入图像上按一定步长滑动来获得输出的,但要实现的是分辨率的增加。例如,反卷积可以实现从2×2的输入矩阵变为4×4的输出矩阵,如图2.6所示,每次取输入特征平面中的一个值,然后在大小为3×3的卷积核的作用下,分配到输出大小为3×3的区域。

图2.5 卷积示意

图2.6 反卷积示意

一个用于分类任务的深层神经网络通过卷积来不断抽象学习,实现分辨率的降低,最后得到一个较小的特征平面(Featuremap),通常大小为5×5或7×7。图像分割任务则需要恢复图片,使其与原尺度大小一样,即需要由较小尺度的特征平面来恢复图片尺度,这是一个上采样的过程。正是由于这个过程正好是卷积的逆操作,因此其通常称为反卷积。

实际上并没有反卷积这样的操作,在现在的深度学习框架中,反卷积通常有两种实现方式:一种是以双线性插值为代表的插值法,另一种是转置卷积。

1.插值法

假如已经知道4个点:Q11=(x1y1),Q12=(x1y2),Q21=(x2y1),Q22=(x2y2),如果要知道任意点的值Qxy),则可以采用插值法。

首先对x方向进行线性插值:

然后再对y方向进行线性插值:

先对y方向再对x方向进行线性插值也能得到同样的结果。

从上面的结果可以看出,这并不是一个线性的插值,而是两个线性插值的融合,这是非常常用的一种提升图像分辨率的算法。

2.转置卷积

转置卷积(Transposed Convolution)也称为反卷积,其实际上仍是一个卷积操作。在Caffe等开源框架中,反卷积的实现与卷积使用同样的代码。

在实际运用时,转置卷积首先需要计算上采样的倍率,也就是用输出尺寸除以输入尺寸,如上面例子中为4/2,即两倍的上采样。得到了上采样倍率,再根据步长的大小和边界补充的方式对初始输入进行变换,然后使用与卷积一样的方法进行参数学习。

2.3.3 卷积神经网络基本概念

上面介绍了二维图像卷积,卷积神经网络正是通过这样的操作来进行特征学习的。在传统BP神经网络中,前后层之间的神经元是“全连接”的,即每个神经元都与前一层的所有神经元相连,而卷积神经网络中的神经元只与前一层中的部分神经元相连。

1.感受野

感受野是卷积神经网络的重要概念之一,当前流行的物体识别方法的架构大多是围绕感受野设计的。

从直观上讲,感受野就是视觉感受区域的大小。在卷积神经网络中,感受野是某一层输出结果的一个元素对应的输入层的一个映射,即特征平面上的一个点所对应的输入图像上的区域,如图2.7所示。

如果一个神经元的大小受到上层N×N的神经元区域的影响,那么就说该神经元的感受野是N×N,因为它反映了N×N区域的信息。在图2.7中,conv2中的像素点5,是由conv1中的2×2的区域计算得来的,而该2×2区域,又是由输入图像中5×5的区域计算而来的,所以该像素的感受野是5×5。可以看出,感受野越大,得到的信息越多。

图2.7 感受野示例

2.池化

从图2.7中的输入图像到conv1,再到conv2,图像越来越小。每过一层就相当于一次降采样,这就是池化。池化可以通过步长不为1的卷积实现,也可以通过直接采样实现。池化层可以对输入的特征平面进行压缩,一方面使特征平面变小,简化网络计算复杂度;另一方面可以实现特征抽象,提取主要特征。

一般而言,池化操作的每个池化窗口都是不重叠的,所以池化窗口的大小等于步长(stride)。最常见的池化操作为平均池化(Average Pooling)和最大池化(Max Pooling)。平均池化指计算图像区域所有元素的平均值并将其作为该区域池化后的值;最大池化则指选取图像区域元素的最大值作为该区域池化后的值。

如图2.8所示为2×2区域最大池化操作示意。

图2.8 2×2区域最大池化操作示意

2.3.4 卷积神经网络的核心思想

卷积神经网络拥有一些重要的特性,包括稀疏连接、权重共享等,这些是它能够成功的保证。

1.稀疏连接与权重共享

在卷积神经网络中,前后层神经元大部分采用局部连接的方式,且在同一个特征平面中的权重共享。局部连接的思想来自生理学的感受野机制和图像的局部统计特性,而权重共享则使图像局部区域学习到的信息可以应用到其他区域,从而使同样的目标在不同的位置能提取到同样的特征。

稀疏连接和权重共享结构大大降低了卷积神经网络的参数量,下面将其与全连接神经网络进行比较。

按照全连接神经网络的思想,对于1000×1000大小的图像,如果隐藏层也是同样的大小,即有1000×1000个神经元,那么由于神经元和图像的每个像素连接,如果每个连接都需要进行学习,则参数量等于1000×1000×1000×1000,光是这一层网络,就已经有1012个参数。而对于卷积神经网络,其某一层的节点只与前一层的一个图像块相连。假如每个神经元只和输入图像10×10的局部区域相连接,且卷积核步长为10,则对于同样的情况,其参数量为1000×1000×10×10,相比之下降低了4个数量级,从而大大减少了模型参数量。

通常来说,卷积神经网络某一层的参数量由输入通道数N、输出通道数M和卷积核的尺寸r,一层连接的参数量等于N×M×r×r

2.能建模图像结构信息

在卷积神经网络中,输入图像的原始结构信息被保留下来,卷积在进行特征提取时通常并不会改变像素的相对空间分布。

对于滤波等任务,相邻像素的作用远远比相隔较远的像素的作用更加重要;而对于颜色变换等操作,不同特征通道同一位置处的像素之间有耦合。可以说,空间关系的保留是卷积神经网络能够提取出鲁棒特征的基础。

2.3.5 卷积神经网络的基本结构配置

与传统的神经网络一样,卷积神经网络依旧是层级网络。通常来说,其包括数据输入层(Input Layer)、卷积层(Convolutional Layer)、激活层、池化层(Pooling Layer)、全连接层(Full Connection Layer)等。

1.数据输入层

虽然数据输入层本身并不属于网络结构,但是这里也有必要进行说明。与传统的全连接神经网络不同,卷积神经网络的输入层就是原始的图像,而非提取的信息,因此卷积神经网络是一个无监督的特征学习网络。

数据输入层主要对原始图像数据进行预处理,基础的操作包括去均值、灰度归一化等,除此之外,还会有一些数据增强相关的操作。

下面是一个典型的使用Protobuf协议进行配置的数据输入层,这是Caffe的深度学习模型配置文件。

可以看出,它的输入类型是ImageData,也就是原生的图像格式。其对应有两个网络参数,分别是image_data_param和transform_param。image_data_param配置了3个属性:source为输入训练文件路径,batch_size为训练的批处理大小,shuffle为是否采用随机操作。transform_param配置了3个属性:mean_value为RGB的均值,crop_size为输入训练图像的尺寸,mirror为一个数据增强操作,指水平的翻转,这些都是图像预处理参数。

2.卷积层

卷积层是网络的特征提取层。一般卷积神经网络包含多个卷积层,一个卷积层可以有多个不同的卷积核。首先通过多个不同的卷积核对图像进行处理,提取特征,每个卷积核会映射出一个新的特征平面,再通过非线性激活函数对卷积输出结果进行处理。

下面是一个典型的卷积层,一个卷积层包含两种参数——权重参数和偏移量参数,还配置了两个param属性,它们分别是上述两类参数的学习率属性的配置。可以看到,在convolution_param中,配置了num_output、pad、kernel_size、stride、weight_filler参数。其中,num_output为输出特征层的通道数目;pad为在卷积前进行的边界填充像素的行列数;kernel_size为卷积核尺寸;stride为卷积的步长;weight_filler为权重参数的初始化策略;bias_filller中配置的是偏移量参数的初始化方法。

3.激活层

卷积神经网络需要激活层来进行特征的选择和抑制,早期经常使用Sigmoid等函数,现在则多使用形式更加简单的ReLU函数。一个典型的激活层如下。

可以看到,ReLU激活层其实非常简单,没有需要学习的参数。当然,有的激活层会有需要学习的参数,我们在后面会进行详细介绍。

4.池化层

池化层用于降低特征平面的分辨率及抽象特征,一个典型的池化层如下。

可以看到,它包含一个参数pooling_param,其中有属性pool、kernel_size、stride。pool用于选择池化的操作,通常有平均池化和最大池化两种形式;kernel_size是池化操作的核的大小;stride是对应的步长。

池化用于压缩网络参数和数据,减小过拟合。如果输入为一幅图像,那么池化层最主要的作用就是在压缩图像的同时保证该图像特征不变。

5.全连接层

通常全连接层在卷积神经网络结构的最后,它也有卷积核和偏移量两个参数。

一个全连接层的配置如下,其包含参数inner_product_param。其中,num_output表示输出特征维度,通常是分类任务的类别数目;weight_filler和bias_filter分别表示权重和偏移量参数的初始化方式。

6.损失层

卷积神经网络的优化原理同一般机器学习算法类似,需要定义损失目标函数,找到最小化损失函数的参数值。常利用SGD(随机梯度下降)等算法来调整权值。

下面所示为一个Softmax损失层,损失层的输入就是网络的输出和真实的标签。

7.精度层

损失目标函数可以反映网络性能,但这不是我们最终需要的指标。对于分类任务,我们最终需要的是分类精度;对于回归任务,我们需要的是定位的精度,所以一个卷积神经网络还要有精度层。

下面是一个分类任务的精度层,与损失层一样,其输入是网络的输出和真实的标签。

图2.9所示为完整的三层卷积神经网络结构,随着各类网络层的提出,CNN结构往往会包含更多层,这里就不再完整地介绍。

图2.9 三层卷积神经网络结构