1.卷积神经网络(CNN)
1.1 CNN定义
深度学习中两类主要的网络结构卷积神经网络和递归神经网络。卷积神经网络(Convolutional Neural Networks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。CNN在计算机视觉任务中取得了巨大的成功,如图像分类、目标检测、图像分割等。
1.2 CNN基本结构
一个卷积神经网络最基本的结构包括卷积层、激活函数、池化层、全连接层、输出层。
将图像作为输入,首先经过卷积层,在卷积层中包含了用于提取特定特征的卷积核;之后经过激活函数,激活函数是用来加入非线性因素,提高网络表达能力,卷积神经网络中最常用的是 ReLU, Sigmoid 使用较少, 因为 Sigmoid 会出现梯度消失的问题; 池化层的作用在于降低网络模型中的参数量,从而遏制过拟合,并且能够提高网络对输入图像的移动、变形、扭曲的处理能力;全连接层的作用在于对卷积层和池化层输出的特征图(二维)进行降维,将学到的特征表示映射到样本标记空间;对于不同的问题,输出会使用不同的函数, softmax函数用于分类问题,线性函数用于回归问题。
下面介绍卷积神经网络的核心组成部分:
(1)输入层:在输入层需要定义模型的输入,将原始数据或者通过其他算法处理后的数据输入卷积神经网络,对数据的形状需要有具体限制。例如在图像识别问题中,输入数据为图像的像素矩阵,数据的宽度和高度就是图像的宽度和高度,如果是灰度图像,数据的深度为1;如果是彩色图像,因为有R、G、B三种颜色通道,深度为3。
(2)卷积层:上图包含两个卷积层,卷积层是卷积神经网络的核心组成部分,通过若干个卷积核对上一层的输入进行扫描可以最大限度地提取原始数据的抽象特征,这正是卷积层的作用,网络中的连接数量通过卷积层能够显著减少。常见的卷积操作一般分为same卷积和valid卷积。
(3)池化层:池化层也称为下采样层、汇聚层。一般在卷积层之后出现。池化层的作用是进行特征筛选,提取区域内最具代表性的特征,从而在宽度和高度上逐渐缩小数据的尺寸。池化层能够减少网络中的参数,从而达到降维的目的。池化操作一般可分为最大池化(max pooling)和平均池化(average pooling),其中最大池化应用更广泛。
(4)全连接层:如上图所示,在多个卷积层、池化层之后有3个全连接层。全连接层与常规的神经网络一致,连接上一层输出的所有特征,全连接层的运算是一个线性映射的过程,为后续的分类任务做准备。
(5)输出层:通过输出层得到模型的输出值,在图像识别任务中,输出值即为输入样本所属类别的概率分布情况。
1.3卷积层
卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。卷积层具有强大的特征提取能力,通过从输入图像中捕获的特征信息进而识别图像中的内容。输入图像的空间结构具有高度(Height, H)、宽度(Width, W)、通道数(Chanel, C)三个维度。特征提取是通过卷积层中的卷积核(滤波器)实现的,这些卷积核在高度和宽度维度上都远小于输入图像,但是在通道维度上与输入图像相同。特征提取的过程是通过卷积核在输入图像上滑动并做卷积运算完成的。
卷积过程图:
卷积运算如下公式(1)所示。卷积核在输入图像上滑动所移动的像素数称为步长(Stride)。卷积过程如上图所示。卷积依据卷积核开始做卷积运算时与输入图像重合的位置可分为三种模式,分别是Full、Same、Valid。Full模式表示卷积核与输入图像刚重合时开始做卷积运算;Same模式表示卷积核的中心与输入图像的边角重合时开始做卷积运算;Valid模式表示卷积核与输入图像全部重合时开始做卷积运算。三种卷积模式如下图所示。因为卷积神经网络是一个深层结构,输入图像边缘的信息在经过多层卷积后可能会丢失。所以在卷积前对输入图像进行数据填充(Padding)以防止边缘信息丢失。常见的数据填充形式是在图像四周补O,经过填充后的图像可以使用Full和Same两种模式进行卷积,以捕获图像边缘的信息。卷积层的输出包含了从输入图像中提取到的特征信息,因此卷积层的输出称为特征图(Feature map)。特征图的大小与卷积核的大小、移动的步长、数据填充的层数有关。设输入图像的大小为nxm,使用的尺度为f的卷积核对其进行卷积操作,在卷积之前对其进行层数据填充,卷积核移动步长为s,则输出特征图的大小可由公式(2)表示。特征图上的像素点在输入图像上映射的区域称为感受野(Receptive field),感受野如下图所示。
Si,j=(I*K)(i,j)mnIi+m,j+nK(m,n)
Sizefeature=n+2p-fs+1×m+2p-fs+1
Full,Same,Valid三种卷积模式如下图:
感受野:
图像卷积运算如下图所示:
1.4池化层
通常当我们处理图像时,我们希望逐渐降低隐藏表示的空间分辨率,聚集信息,这样随着我们在神经网络中层叠的上升,每个神经元对其敏感的感受野(输入)就越大。而我们的机器学习任务通常会跟全局图像的问题有关(例如,“图像是否包含一只猫呢?”),所以我们最后一层的神经元应该对整个输入的全局敏感。通过逐渐聚合信息,生成越来越粗糙的映射,最终实现学习全局表示的目标,同时将卷积图层的所有优势保留在中间层。
此外,当检测较底层的特征时(例如边缘),我们通常希望这些特征保持某种程度上的平移不变性。例如,我们拍摄黑白之间轮廓清晰的图像 X,并将整个图像向右移动一个像素,即Z[i,j]=X[i,j+1],则新图像 Z 的输出可能大不相同。而在现实中,随着拍摄角度的移动,任何物体几乎不可能发生在同一像素上。即使用三脚架拍摄一个静止的物体,由于快门的移动而引起的相机振动,可能会使所有物体左右移动一个像素(除了高端相机配备了特殊功能来解决这个问题)。 而池化层则可以解决这样的问题,池化(pooling)层,它具有双重目的:降低卷积层对位置的敏感性,同时降低对空间降采样表示的敏感性。
与卷积层类似,池化层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为 池化窗口)遍历的每个位置计算一个输出。然而,不同于卷积层中的输入与卷积核之间的互相关计算,池化层不包含参数。相反,池运算符是确定性的,我们通常计算池化窗口中所有元素的最大值或平均值。这些操作分别称为最大池化层(maximum pooling)和 平均池化层(average pooling)。在这两种情况下,与互相关运算符一样,池化窗口从输入张量的左上角开始,从左到右、从上到下的在输入张量内滑动。在池化窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值,具体取决于是使用了最大池化层还是平均池化层。