相信和笔者一样爱技术对AI兴趣浓厚的小伙伴们,一定对卷积神经网络并不陌生,也一定曾经对如此“高级”的名字困惑良久。今天让我们一起回顾/学习这玩意到底是什么和为什么呢。
引言
说起CNN,必然会首先想到的是CV吧,而边缘检测可谓是CV中家喻户晓的一种应用场景。以原始图片尺寸为6x6为例,如下图所示,其左半部分是像素值较大,是明亮区域;右半部分像素值较小,为深度区域。中间的分界线即就是要检测的边缘。
那么怎么检测边缘呢? 此时滤波器filter(也叫kernel)出场了,如下图所示,kernel尺寸为3x3。
滤波器filter滑过输入图片,在每个区域处稍做停留,对应元素相乘再相加计算,之后再向其它区域滑动继续计算,直到滑动至原图片的最后一个区域为止。这个过程即为卷积。
由上图可以看出,输出结果的中间颜色浅,两边颜色深,说明原图的边界已反应出来。因此可以总结出,边缘检测就是通过输入图片与相应滤波器进行卷积运算得以识别。
另外,这里的滑动还涉及到一个基本概念,步长stride,上述示例中,是以stride为1说明,每次滑动一格,共停留了8x8个区域,所以最终输出结果是8x8矩阵。
卷积神经网络CNN
经过上面边缘检测这一具体的目标检测场景的分析,我们也就不难理解,CNN(Convolutional neural network)就是通过各种各样的滤波器filter不断提取图片特征,从局部到整体,进而识别目标。
而在神经网络中,这些filter中的每个数字,就是参数,可通过大量数据训练得到(即深度学习的过程)。
CNN中的基本概念
Padding
如上所述边缘检测的例子中,可以看到,原图片尺寸是10x10,经过filter之后是8x8。如果再做一次卷积运算就是6x6…这样的话会有两个缺点:
- 每次做卷积操作,输出图片尺寸缩小
- 角落或边缘区域的像素点在输出中采用较少,因此容易丢掉图像边缘位置的许多信息。
如下图中左上角红色阴影只被一个输出触碰到,而中间的像素点(紫色方框标记)会有许多3x3的区域与之重叠。所以,角落或边缘区域的像素点在输出中采用较少,容易丢掉图像边缘位置的许多信息。
为了解决这一问题,我们通常采用Padding的方法,在卷积操作之前,先给原图片边缘填充一层像素,
例如,将10x10的图像即可填充为12x12的大小,卷积之后的图片尺寸为8x8,和原始图片一样大,这样便使得原图的边缘区域像素点也可以多次被采用。
选择填充多少像素,通常有两种选择:
- Same卷积:即如上所述,填充再卷积之后的图片大小与原图片一致。
- Valid卷积:不进行填充操作,直接卷积。
stride
stride的概念在引言中有提到过,表示过滤器filter在原图片中水平方向和竖直方向每次滑动的长度,也叫步进长度。
假设s表示stride长度,p表示padding长度,原图片尺寸是nxn,过滤器filter尺寸是fxf,则卷积后的图片尺寸为:
pooling池化
pooling在CNN中的作用是减小尺寸,提高运算速度,减小参数数量,防止模型过拟合,让各个特征更具有健壮性。常见的pooling做法有如下两种:
Max pooling
即在滤波器filter滑动区域内取最大值,而无需卷积运算。数字大意味着可能探测到了某些特定的特征,忽略了其它值,降低了噪声影响,提高了模型健壮性。并且,Max pooling需要的超参数仅为滤波器尺寸f和stride长度s,无需要训练其它参数,计算量较小。
Average pooling
即在滤波器filter滑动区域内求平均值。
3通道图片卷积
CV中我们通常要面对的都是彩色图像,包括RGB三个通道。同时,3通道RGB图片对应的滤波器算子也是3通道。
例如10x10的RGB图片,维度就是(10x10x3),分别表示图片的高度(height)、宽度(width)和通道数(channel)。
卷积运算过程
3通道图片的卷积运算与单通道图片的卷积运算基本一致,其过程是将每个单通道(R,G,B)分别与其对应的filter进行卷积运算。如下图所示,以过滤器filter位于原图片左上角为例,过滤器filter有27个参数(3x3x3)。分别取原图6x6x3中红、绿、蓝通道的9个数,与黄色过滤器filter覆盖的对应27个数相乘,得到27个数,再将其相加,即可得到4x4矩阵中左上角的数字,以此类推。
另外如果使用多个不同的滤波器,则卷积运算会分别输出一个4x4矩阵,二者堆叠在一起,即输出4x4x2的立方体。如下图所示。
CNN的整体结构
卷积神经网络CNN由输入层、卷积层、Relu、池化层和全连接层组成。如下图所示是一个卷积网络示例,卷积层是卷积网络的第一层,其后跟着其它卷积层或池化层,最后一层是全连接层。
越往后的层识别图像越大的部分,较早的层通常专注于简单的特征(例如颜色和边缘等)。随着图像数据在CNN中各层中前进,它开始识别物体的较大元素或形状,直到最终识别出预期的物体。
其中,
- 卷积层:由滤波器filters和激活函数构成,属于CNN的核心层,主要作用是提取样本特征。它由输入数据、filter(或卷积核)和特征图组成。若输入数据是RGB图像,则意味着输入将具有三个维度——高度、宽度和深度。filter的本质是一个二维权重矩阵,它将在图像的感受野中移动,检查特征是否存在。卷积的运算过程如上所述。卷积层一般要设置的超参数包括过滤器filters的数量、步长stride以及Padding的方式(valid or same)以及激活函数等。
- 池化层:(可参见上文所述) 本质即就是下采样(Downsampling),利用图像局部相关性原理,对图像进行子抽样,在保留有用信息的前提下减小数据处理量,具有一定的防止模型过拟合作用。
- 全连接层:该层的每一个结点与上一层的所有结点相连,用于将前边提取到的特征综合在一起。通常,全连接层的参数是最多的。
CNN的优势
与传统神经网络相比CNN具有局部连接、权值共享等优点,使其学习的参数量大幅降低,且网络的收敛速度也更快。
- 局部连接:特征图的每个输出值不需要连接到输入图像中的每个像素值,而只需要连接到应用过滤器filter的感受野,因此卷积层通常被称为“部分连接层”,这种特性也即是局部连接。
- 权值共享:当卷积核在图像上移动时,其权值是不变的。即为权值共享。