卷积神经网络在计算机视觉领域取得了巨大的成功,甚至在音频处理等其他领域,卷积神经网络也能发挥较好的效果。那么,卷积到底是怎么样的一种运算呢?为什么卷积神经网络在图像处理上会有这么大的优势呢?让我们一起深入研究卷积神经网络的原理,学习卷积神经网络,能让你处理远比MNIST数据集复杂的图片,开启视觉计算的新领域。
什么是卷积?
二维卷积
卷积(convolution),其实就是一种数学运算。让我们来看一下面的这个卷积运算的例子:
事实上,卷积是一种非常简单的运算,与矩阵乘法不同的是,他对矩阵维度要求不是很高,允许不同大小的矩阵进行运算。为了方便说明,我们首先定义一下几个说法。
(1)式中卷积符号左侧的6x6矩阵叫被卷积矩阵
(1)式中卷积符号右侧的3x3矩阵叫做卷积核
卷积运算的步骤如下:
把卷积核“覆盖”到被卷积矩阵左上角的位置,将对应元素相乘并相加,作为结果矩阵中的左上角元素。(1)式中的运算过程如下:
把卷积核右移一格,重复进行1操作。如果到行尾,则换行继续,直到“覆盖”到右下角元素为止(这一步有点像滑动窗口)。
通过GIF可以形象地说明这一运算的过程:
不过,我们这里的卷积和数学上讲的卷积有一些区别。数学上的卷积要多一个把被卷积矩阵旋转180度的操作。
三维卷积
由于图像有可能是彩色的,因此图像组成的矩阵会变成 宽度
x高度
x通道数量
的三阶矩阵。彩色图片的通道数(num of channels)一般为3。然而,三维而计算方法和二维的计算方法是一样的,只是原本的3x3的卷积核变为3x3x3的而已,求和的时候变成27个数相加,最后结果是一个二阶矩阵。
为什么卷积能用于视觉领域
利用卷积运算,计算机可以完成边缘检测的任务。假如有矩阵如下:
如果用(1)式中的卷积核,对这张图片做卷积,结果会是这样的:
如果把他们转化成图片,可以很直观的看到,原图左侧是黑色,右侧为白色;而图像经过卷积以后变成中间一条黑色,两边是白色。这说明了原本黑白交接的边界线被卷积识别出来了。因此,(1)(2)中的卷积核实际上是起到了检测图片垂直边缘的作用。同样地,如果给这个卷积核加上一个90度的旋转变换,可以得到一个水平边缘检测器。不难想象,如果在神经网络中使用卷积运算,网络就可以通过拟合卷积核中的参数来检测不同方向上的边缘。这就是卷积提取图像特征的方式。
事实上,卷积神经网络在一个卷积层中会使用多个卷积核。每一个卷积核进行卷积运算都会得到一个二阶矩阵,这个矩阵我们把他叫做feature map(特征图)。使用n个卷积核就会形成n个feature map。最后我们会把这些feature map“叠”在一起,进入下一层计算,下一层的输入通道数即为n。
卷积运算的常用参数
卷积核大小
卷积核大小,顾名思义,就是卷积核矩阵的维度。通常为奇数,常见的取值有3x3,5x5和7x7。现在一般认为小卷积核的效果比较好。一个7x7的卷积,其实可以用两个3x3卷积来代替。
Padding和Stride
padding(填充的层数): 我们从(1)的例子中可以看到,做完卷积运算以后,图片变小了(从6x6变成了4x4)。这不利于进一步提取图像特征。因此,我们可以使用padding来填充图像外围区域,比如填0,来把原图变大,这样可以保证卷积后图片的大小。
stride(步长):指的是在“滑动窗口”的过程中,每次滑动的步长。你可以对横向和纵向分别设置。
卷积的好伙伴——池化(Pooling)
观察(2)中的卷积结果,可以发现用卷积做边缘检测时,边界线被“弄粗”了。这个时候我们可以用池化来解决这个问题。池化也是一种非常简单的数学运算,我们还是先来看一个例子:
还是那卷积运算中的滑动窗口的眼光来看,这里用了2x2池化,也就是用2x2的窗口去套原矩阵,并且选择2x2窗口中的最大值,组成新的矩阵。你也可以选择2x2窗口中的平均值,这是两种不同的池化方式,一个叫Max pooling(最大池化),另一个叫Average pooling(平均池化)。我们一般用缩写MP和AP来表示。
池化还有一个好处,他可以把feature map缩小,减少运算数量。同时,池化是不需要参数的,也就是不参与训练,不会耗费训练时间。
卷积神经网络(CNN)
卷积神经网络由输入层,卷积层和全连接层构成。
卷积层(Conv)
卷积层就是把图像对多个卷积核进行卷积,然后再对得到的feature map做池化处理。一个卷积层通常由卷积+池化组成(大概是池化没有参数,所有不配单独成池化层233333)。
在卷积层中,出了刚刚提到的卷积参数以外,还有一个超参数需要配置,就是卷积核的个数。这个在上文也已有介绍。
全连接层(FC)
一个CNN网络通常会包含多个卷积层,然后在后面接一个或者多个全连接层。全连接层实际上就是以前接触过的普通的神经网络中的层。负责把conv层提取到的特征进行归纳计算。
卷积层的优势
- 卷积运算量不大,可以高效提取特征信息。
- 池化层可以大大减少运算量,加快训练速度。
- 多个卷积层可以把图片中的参数变少,比如128x128x3的图片,经过数轮卷积层以后变成7x7x128的feature map,图片参数从49152减小到6272。