什么是卷积网络
前面我们介绍了传统机器学习在图像检测中的应用,这一章我们将介绍另一种叫“深度学习”的方法来进行图像的检测,而这种方法的关键则是一个叫做“卷积神经网络(CNN)”的工具。
那么如何介绍这项叫做“卷积神经网络”的技术呢?一开始就让我犯了难。
我们知道介绍一件事物,最好是先给出它的概念,一个符合“信达(雅)”的简明易记的概念是对理解这个事物最好的帮助,如果能用一个词就表达清楚这个概念的含义,它便有能力广泛传播;如果能用一句话就解释清楚一个概念的含义,那么它肯定可能使一般人都以理解,很可惜的是,一些复杂的技术,由于它本身即使用了多种其他技术的集合,于是使人难以用一两句话就把它说清楚,往往顾了头来顾不了尾,给人感觉无论从哪个方面开始说都说不明白。
这个“卷积神经网络”的名词,给人的就是“李白军霸上”那种望文而无法生义的感觉,而我们又似乎没办法直接用一个名词或者一句话将它的内涵概括,所以我打算自下而上,先把这个词拆开来,变成一个个零件,先把零件介绍清楚,再来讲这个词完整的涵义。
不仅如此,为了讲明白,同时还有几个相关的概念,包括什么叫做“深度学习”,什么又是“图像检测”,我们都需要一个一个来讲清楚。
首先我们来介绍“卷积网络”里面的“卷积”。如果从考古学来讲,“卷积”这一概念似乎要来源于通信工程领域的一种计算方法,这里我们采信网上的一种说法,因为其对卷积的介绍似乎使其字面意义非常形象。(原文链接:如何通俗易懂地解释卷积? – palet的回答 – 知乎https://www.zhihu.com/question/22298352/answer/637156871)
首先卷积是一个动词,而这个动作需要拆开来分成“卷”和“积”两个步骤。如何理解呢?譬如说有这样一个例子(只是一个例子,不代表卷积只能用来解决这类问题):在信号分析领域,人们需要分析信号随时间衰减的复杂情况。一个信号生产之后,它的信号值会随时间衰减,同时,随着时间变化,又不断有新的信号产生,新的信号和旧的信号叠加在一起,构成了某一时刻总的信号值。
那么假如有下面这幅图,如何求某一时刻的输出信号值呢?
图中,f(t)表示输入信号,代表了在不同时刻,输入信号的强度(能量的高低),例如在第3秒的时候,系统获得了一个较低的输入信号,然后从第4秒开始,输入的信号值越来越高,到第7秒达到最高,之后继续起伏。
而g(t)表示信号随时间的衰减,比如第3秒产生的这个输入信号,它在第7秒(即经过了4秒之后),能量衰减到多少。
如果在 t=0 的时刻有一个输入,那么随着时间的流逝,这个输入将不断衰减。换言之,到了 t=T时刻,原来在 t=0 时刻的输入f(0)的值将衰减为f(0)g(T)。
因为信号是持续输入的,每一时刻都有新的输入信号产生,那么在某一时刻信号的总幅值,应当是新产生的输入信号,和所有已经存在(并且正在衰减,但仍然没有衰减到0)的信号的全部能量的叠加。
以下图为例,在T=10时刻,输出结果跟图中带标记的区域整体有关。其中,f(10)因为是刚输入的,所以其输出结果应该是f(10)g(0),而时刻t=9的输入f(9),只经过了1个时间单位的衰减,所以产生的输出应该是 f(9)g(1),如此类推,即图中虚线所描述的关系。这些对应点相乘然后累加,就是T=10时刻的输出信号值,这个结果也是f和g两个函数在T=10时刻的卷积值。
从图上我们看到,f(t)中的时间变量(我们设为t1)越大,则其对应的g(t)中的时间变量(我人设为t2)越小,因为越后出现的信号,其经过衰减的时间越短。这看起来呢,就有点不直观,如果我们把g(t)中的时间翻转一下,变成g(-t),看起来就方便多了,如下图所示,t2全部从坐标轴的右侧翻转到左侧。
把g(t)水平翻转一下之后呢,f(t)与g(t)之后,时间靠后的变量,乘以时间靠后的变量,这些连线不需要交叉到一起了,直观了许多。但这还不够,虽然看起来已经顺了,但是从数学的计算上来看,仍然比较麻烦,因为变量t取值不同,有的在坐标轴左侧,有的在右侧,不方便计算。那么有什么办法更简便一点呢?像下图一样,将g(-t)再往左边挪一段,要上方的f(t)对齐,变成g(T-t),是不是变量取值就一致了?
大家可以看看,翻转拉动之后,某时刻T总的信号幅值就变成了
这个是离散信号的形式,对于连续信号,则是积分形式。
那么这里,g(-t)挪动多少,就T取什么值,则变成一个都要考虑的参数,比如说在上面这个例子中,我们也可以取函数从g(0)到0经过的时间作为T,即20秒的时间。
从这个例子中,我们可以把卷积形象地理解为:卷,就像卷地毯一样,拉过来,再翻转一下,就像我们对g(t)所做的那样;积,是一个累积求和的过程,即是把所有g(t)f(t)的值全部加总。
在这里,T的选择是一个关键,而且有t+(T-t) = T。
来来回回扯这么一大段,说明了卷积其实只是一个数学方法,目的就是为了让我们不那么费眼神,可以更直观地看出或计算出函数之间变化的关系而已。你可以理解为卷积最初的含义是一种数学加工方法,用来处理一个函数随另一个函数变化的关系,使其能更直观地被理解。
大白话就是:用一个函数去乘另一个函数。其中一个函数你可以理解为原始数据,另一个函数你可以理解为滤波器。
好了,考古时代(今天仍然在广泛应用)的卷积我们已经讲明白了,那么在图像处理领域卷积是不是还是这个意思呢?应该说基本原理还在,只是“卷”字的概念被淡化了。在上例通信信号的加工中,你可以理解为f(t)是一个一维信号,而g(t)是一个滤波器,经过g(t),信号会发生一些特定的变化,这取决于你所选取的滤波器是什么样的。而在图像处理中,信号由一维变成了二维,相应的,滤波器也由一维变成了二维。那么为什么要对图片进行“卷积”呢?滤波器在这里起什么作用?其实滤波器的作用很简单,就是从信号中提取一些特征,对于二维的图像,它的作用就是从图像中提取特定特征。有没有觉得眼熟,是不是跟前文提到的一块块哈尔特征模板的作用有些相似?
那么它是怎么做到的呢?让我们先来看看形象的例子。下图应用了一个叫Sobel 的边缘检测器,仅仅做了一些简单的卷积,就可以从色彩鲜艳的衣服照片(下图)中准确地提取出衣服的轮廓,而且所用到的滤波器也相当简单,简单到什么程度呢?就像下面这样(两个式子一个是提取纵向边缘,一个提取横身边缘)
前面我们提到,在二维的图像卷积中,滤波器也变为二维,所以它是一个矩阵数组,以上例中的第一个式子为例,为什么它能提取出图像垂直方向的边缘呢?你看它的左侧都是负数,中间一列都是0,右侧都是正数,而且全部加起来正好是0。假设以这样一个3 x 3像素的滤波器在灰度图像中扫描所有位置,进行卷积(对应位置相乘,所有相乘结果求和),那么在像素均匀(例如图像的内部)的位置,它的卷积值接近于0,相反如果在图像的边缘位置,则卷积值会明显不等于0,因为图像内部的像素值会明显低于外部,或者相反。
还是以我们在上一章中用到的一张图为例。
假设我们将滤波器
用在(4,13)位置提取特征。
255 | 171 | 113 |
255 | 140 | 114 |
255 | 129 | 116 |
卷积值:
255*(-1)+255*(-2)+255*(-1)+171*0+140*0+129*0+113*1+114*2+116*1=-563
而将同样的滤波器用在(8,11)位置提取特征,
131 | 132 | 132 |
132 | 132 | 132 |
132 | 132 | 131 |
则卷积值为
131*(-1)+132*(-2)+132*(-1)+132*0+132*0+132*0+132*1+132*2+131*1 = 0
这样图像的边缘与轮廓就被提取出来了。
在二给图像的卷积计算中,这些滤波器又被称为卷积核,可以看出来,我们并没有“拉动”和“翻转”矩阵中的数据,或者说在设计它们的时候,就已经提前做了“拉动”和“翻转”的动作了。所以我们说,在二维图像的卷积过程中,“卷”的动作被淡化了。
到这里,我们可以总结,在“卷积神经网络”中,并没有出现“卷”这个动作,就像“神经网络”跟神经也没什么关系一样,可以说这个名字当初起名的时候,即没有做到“信”,也没有做到“达”,最多是达到了“雅”的标准了。
但是,它的基本意思还是在的,就是一个函数(原始图像)随另一个函数(滤波器)变化的关系。或者你可以理解为两个函数相乘,或者两个矩阵相乘,反正就是这么一回事。
后面我们会不断用到“卷积”这一数学加工方法,所有你肯定会对它像老朋友一样熟悉。
顺便说一下,上面使用到的检测边缘的滤波器,还可以再改造得更简单,变成这样:
只不过它的效果未必有Sobel 算子那么好了。
接下来,我们再讲讲网络是什么。网络即是一个从输出到输出的,单向的网。有全连接的网络,也有非全连接的网络(例如卷积神经网络)。全连接网络即网络后一层的任一点,都与前一层所有节点相连,或者说,后一层上的任一点,都受前一层所有节点的影响。而像卷积神经网络非全连接的层,其后一层网络上的任一点,仅受前一层网络中局部区域的节点的影响,例如卷积层中,后一层的任一点,仅由前一层中卷积核大小的区域(有人称此为感受野)中的像素计算而来。
网络的例子
讲完这么多,终于可以给卷积神经网络一个粗浅的定义了,而有了这个定义之后,我们才好详细来介绍它的内涵,说明清楚卷积神经网络到底是什么,怎么起作用的。就像我们一开始说的那样,介绍一件事物,最好是能先给出它的概念。
定义:卷积神经网络是指使用一种被称为“卷积”的,将二维输入数据与二维滤波器进行计算的数学加工方法,从原始图像中提取出简单特征,并且通过网络的一层层向后递进,将简单特征组装成复杂特征,从而最终对图像中的物体进行分类,完成图像检测任务的方法。
不能说定义有多好,至少比各类百科的定义要言之有物吧。假如你从未学习过这个概念,在第一次看见这段定义的时候,至少对卷积神经网络是什么有一个粗略的轮廓。凑合着用吧。
而且我也努力做到在一句话内完成这个定义。