1.2 卷积神经网络
1.2.1 CNN基本操作
1.卷积
卷积是分析数学中的一种重要运算,在许多工程学中有着重要的应用,如信号处理。在深度学习中,卷积是一种核心算子。深度学习的卷积计算方式和信号处理的卷积计算方式有较大的差异。本书只讨论深度学习的卷积。
对于单通道的卷积,计算方式如图1.3所示。
图1.3
由图1.3可以看出,卷积的计算方式是输入矩阵与卷积核(Convolution Filter)之间对应位置的乘加运算。为了便于确定目标像素的位置,一般选取的卷积核的大小为奇数,在深度学习中常用的卷积核的大小有1×1、3×3、5×5等。值得一提的是,1×1的卷积核常用于调整维度。
卷积窗口的滑动通过步长(Stride)控制,当卷积步长为1且不做padding操作时,卷积计算后的特征图(Feature Map)会变小,如7×7的输入与3×3的卷积核相乘,生成的特征图的大小为5×5。此时若想保持目标特征图的大小不变,则可以使用padding操作。padding操作的常用方法是在输入矩阵的外围补0,这样7×7的输入在经过padding操作之后,大小变为9×9,与3×3的卷积核卷积之后得到的特征图的大小仍为7×7。
注意:本书中出现的卷积核大小(如3×3)、图像大小(如224×224×3)、步长大小(如1)、特征图大小(如5×5)等的单位均为像素(pixel,px),后文将不再逐一说明。
2.激活
在CNN中激活函数用于提供非线性操作,增加模型的表达能力。常见的激活函数有Sigmoid、Tanh、ReLU等。每种激活函数都有各自的优缺点,在实际工程中可以根据业务需要选择。
Sigmoid函数又称Logistic函数。Sigmoid函数的函数曲线如图1.4所示。
图1.4
由图1.4可以看出,Sigmoid函数的输出范围为0~1,该函数可以将较大的负数转换为0,较大的正数转换为1,用于将一个实数映射到0~1的范围内,在二分类中使用得较多。
Sigmoid函数的致命缺点在于梯度消失,当输出接近于0或1时,神经元饱和,此时的梯度接近于0,神经元权重几乎不更新,导致网络无法反向传播,因而无法继续训练。另外Sigmoid函数的输出不以0为中心,计算量比ReLU函数大。
Tanh函数又称双曲正切激活函数,输出范围为-1~1。Tanh函数的函数曲线如图1.5所示。
图1.5
Tanh函数的输出以0为中心,但是仍然存在梯度消失的问题,计算量也比较大。
在深度学习中,最常见的激活函数为ReLU函数。当ReLU函数的输入x<0时,输出为0;当x≥0时,输出为x。ReLU函数的函数曲线如图1.6所示。
图1.6
ReLU 函数有效地解决了梯度消失的问题,有助于模型更快地收敛,在计算中不存在指数等复杂的运算,计算量较小。但是ReLU函数也存在一些缺点,最重要的就是神经元坏死的问题,当输入x<0时,ReLU函数的输出为0,在向后传递的过程中,该神经元不会被重新激活。这将导致梯度无法更新,影响网络学习。该问题的解决办法是使用Leaky ReLU函数,该函数在输入x<0时仍会有较小的输出。
3.池化
池化操作常被用于卷积操作之后,可以减小特征表示的空间大小,减少网络中的参数量和计算量,有助于控制过拟合。池化操作的池化核(kernel)大小常设置为2×2。常用的池化操作包括最大池化(max-pooling)和平均池化(average-pooling)。最大池化的操作如图1.7所示。
图1.7
如图1.7所示,池化操作使用的kernel大小为2×2,步长为2,对应左上角的2×2区域的4个值——1、1、5、6,最大池化就是选取其中的最大值,即6。平均池化的操作类似,只是计算2×2区域中4个值的平均值。
4.全连接
全连接(Fully Connected,FC)计算和卷积计算类似。卷积计算通过卷积核在特征图上滑动计算,获取的是局部感知特征,对输入特征图的大小没有要求。全连接计算的权重固定,针对整个特征图卷积,获取的是全局信息,需要固定大小的输入特征图。在 CNN 中,卷积、池化和激活操作负责特征的提取,而在模型的最后加上全连接操作则是为了使用所有的特征进行分类等。
全连接的参数量在整个模型的参数量中占比相当高,很多参数存在冗余,参数量大会给模型训练和部署增加难度。因此,有的算法采用全局平均池化(Global Average Pooling,GAP)等方式替代全连接,这样可以减少计算的参数量。
1.2.2 CNN原理
CNN是深度学习的基础,在LeCun进行手写数字识别任务的研究时被提出。CNN的设计思想包括以下三点:
(1)局部感知(Local Receptive Fields);
(2)共享权重(Shared Weights);
(3)空间或时间下采样(Spatial or Temporal Sub-Sampling)。
简单的CNN主要由4种结构构成:卷积、激活、池化和全连接。图1.8所示为常见的分类网络。
图1.8
图1.8所示的网络输入通过卷积、激活、池化和全连接操作,最后输出图像所属的类别。其中,卷积层(CONV,与conv相同,下面不再说明)执行计算输入的特征图与卷积核的卷积操作,用于提取图像中的特征;激活层(ReLU)用于增加非线性运算,此处使用的激活函数是 ReLU;池化层(POOL)用于执行池化操作,对输入的特征图进行采样;全连接层(FC)用于计算分类任务的类别分数,进行分类操作,从而预测输入图片的类别。
图1.8所示的分类网络对输入的原始图像进行逐层计算,得到最终的类别分数,通过网络训练更新卷积层和全连接层的权重和偏置参数,激活层和池化层不需要进行参数训练。另外,在网络训练中有一些参数需要设置与调整,但是这些参数不是通过网络的学习而变化的,需要人工设置调整变化,如学习率等,这些参数被称为超参数,网络调参就是调整超参数。