2.1 CNN的核心——“卷积”
本案例主要介绍卷积神经网络(Convolutional Neural Networks,CNN)。在此之前,需要先对“二维卷积”(以下简称“卷积”)进行深入了解,它是研究卷积神经网络的前提和基础。
从系统工程的角度看,卷积是为研究系统对输入信号的响应而提出的,卷积有很多种,本节着重介绍二维滑动卷积。
滑动卷积涉及三个矩阵:第一个矩阵通常尺寸较大且固定不动,本书称之为“输入矩阵”(或“待处理矩阵”);第二个矩阵尺寸较小,在输入矩阵上从左到右、从上到下进行滑动,本书称之为“卷积核”;卷积核在输入矩阵上面滑动的过程中,将对应的两个小矩阵的相应元素相乘并求和,结果依次作为第三个矩阵元素,本书称该矩阵为“特征矩阵”。上述三个矩阵及卷积运算符如图2-1所示。
下面,详细地看一下滑动卷积的运算过程。将图2-1中所示的两个矩阵进行卷积运算。
步骤1:将阴影部分的4个元素与卷积核对应位置的元素相乘后,再相加,作为特征矩阵的第1个元素,如图2-2所示。
图2-1 输入矩阵、卷积核、特征矩阵及卷积运算符
图2-2 滑动卷积运算步骤1
计算过程如下。
(1×1) +(3×0) +(2×0) +(9×1) =10
步骤2:在步骤1的基础上,向右滑动1个单位,将阴影部分的4个元素与卷积核对应位置的元素相乘后,再相加,作为特征矩阵的第2个元素,如图2-3所示。
图2-3 滑动卷积运算步骤2
步骤3:在步骤2的基础上,向右滑动1个单位,将阴影部分的4个元素与卷积核对应位置的元素相乘后,再相加,作为特征矩阵的第3个元素,如图2-4所示。
图2-4 滑动卷积运算步骤3
步骤4:一旦完成第一行的运算之后,上述运算过程就从下一行开始从左到右继续进行,如图2-5所示。
图2-5 滑动卷积运算步骤4
步骤5:重复相同的步骤,直到全部完成(见图2-6)。
图2-6 滑动卷积运算的结果
在上述卷积运算的过程中,每次都是滑动1个像素。当然,也可以每次滑动两个像素乃至多个像素。每次滑动的像素个数,本书称之为步长(Stride)。
请读者仔细观察图2-1所示的输入矩阵与特征矩阵的元素的个数,不难发现,特征矩阵元素的个数少于输入矩阵的元素个数(请读者思考其中的原因)。如果需要得到与输入矩阵元素个数相等的特征矩阵该如何处理呢?方法很简单,需要对输入矩阵的边缘添加0元素,这个过程称之为零填充(Zero Padding)。通过零填充,实现滑动卷积的过程如图2-7所示。
在二维滑动卷积运算过程中,卷积核在滑动过程中始终都在输入矩阵内部,所得到的特征矩阵的元素个数会比输入矩阵元素个数少,在程序中称这种滑动卷积方式为valid;如果采用零填充的方式,使特征矩阵元素的个数与输入矩阵元素个数相同,在程序中称这种滑动卷积方式为same。
如图2-8所示,特征矩阵的(3,1)元素的值最大。那么,为什么该元素的值最大呢?通过观察输入矩阵和卷积核元素的特征可知:第(3,1)元素所对应的子矩阵与卷积核在形态上类似,二者都是对角矩阵,而且相同位置上的数值都较大。由此可见,子矩阵与卷积核在形态上类似时,卷积运算就会生成一个较大的值。
图2-7 通过零填充实现滑动卷积的过程示意图
图2-8 特征矩阵中第(3,1)元素的计算过程
如图2-9所示,输入矩阵中第(3,1)元素的值为20,在输入矩阵中的值是最大的,但通过卷积运算后结果为2,原因是子矩阵与卷积核的形态差异很大。
图2-9 特征矩阵中第(2,1)元素的计算过程
如果要使特征矩阵中第(2,1)元素的值变大,可以将卷积核更换为和对应的子矩阵与卷积核在形态上类似的,如图2-10所示。
图2-10 更换卷积核后特征矩阵中第(2,1)元素的计算过程
通过上面的分析可知,对二维数字图像进行卷积运算,可以判断图像的像素与卷积核的相似程度,相似程度越高,得到的响应值越大,因此可以通过滑动卷积运算来提取图像的特征。