在泛函分析中,卷积、旋积或褶积(英语:Convolution)是通过两个函数f和g生成第三个函数的一种数学运算,其本质是一种特殊的积分变换,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。
我们可以很容易的得到下面这个公式。直接看公式和概念是很抽象的,所以我们先看下面的这个例子。
假如有一个人24小时内不间断吃食物,那么进食的就可以用下面这张图表示。横坐标表示进食的时间,纵轴表示进食的量。
但是呢一个人不可能只进食,所以他还会消化。所以消化也可以用一张表来表示。横轴表示消化的时间,纵轴表示对应时间你消化的比例。时间越长 消化就越多。
不定时的进食,和不间断的消化是一个动态过程,并没有那么容易计算出来。但是卷积却能很好的替你解决这个问题。
这里设 f
函数表示进食,g
函数表示消化。
假如我们不考虑消化的话,我们只需要将每次进食的量进行一个累加即可。那么反应到图上就是求[0,14]点的一个区域面积。
但是,他吃了东西还会一直消化,所以单纯的看f函数是远远不够的,假如这个人在12点吃了一碗米饭,那么在下午2点还剩多少呢?这里就需要看g函数了。
从12吃米饭,到下午2点共用了2小时,那么我们就需要看g函数在2小时后还剩多少食物的一个百分比。那么我们就可以得出一个公式 residue = f(12) * g(14 - 12)
。那么我们就可以得出一个进食点在下午2点还剩的食物量。
所以我们要计算所有食物最后的剩余量,需要在[0,14]点这段区间内吃的所有食物进行一个计算即可。假如我们在x时刻进食,计算t时刻还剩多少食物。可以得到一个公式。
我们仔细看f的参数和g的参数最近会把x消掉,这也是卷积的一个标志。接下来我们聊一聊x
和g-x
分别表示什么含义。
假如我们T时刻进食,那么对应在g函数就是0时刻,就会有下面图中这样一条连线。
那么这个时候我们就得出一个相加积分公式:
现在我们推出来公式和卷积公式仅仅是符号的差异,其他均相同。我们的[0,t]表示的是时间,所有不可能有负数,有一定的物理意义。
有一个系统,input不稳定 output稳定,那么我们就可以拿卷积来计算这个数值。
卷积神经网络主要的作用就是识别图片中的某一些特征。例如获取图片中的人脸、以及面部表情等。
例如下面这种图片是一个分辨率为80*40照片,我将其做了一个放大处理。我们可以看到其有很多的小方格。这里的每一个方格就是一个像素。灰度值就是每个格子中RGB颜色对应的数值。
卷积操作是使用一个二维的卷积核在一个批处理的图片上进行不断扫描。
这里我们以一个3*3的卷积核进行演示。卷积核与图片对应的俩个位置进行相乘,得到9组结果然后进行累加,得到一个新的像素点。
但是呢,这样处理完图像后,后少一圈。
所以引入Padding
:为了使输入的矩阵尺寸和输出的矩阵尺寸一致,我们会在输入矩阵的外层一圈补0像素,这样就可以得到同样尺寸的图片。
这和前面说的卷积操作好像不太一致啊。 哪个是f函数,哪个是g函数?
图像的卷积操作就是拿图片和卷积核先相乘后相加。这个和前面说的卷积的方法是相同的。
那么我们就可以得出图片和卷积核必然一个是f另一个是g。因为图片是一直在变化的,而卷积核是全程不变的。
周围很多像素点对某一个像素点产生的影响。
为什么这么说呢,看下面这几种卷积核操作完后的效果。
平滑卷积就是将图片变得更加平滑、朦胧。
这里以一张教材的图片为例。左侧为平滑前的图片,右侧为平滑后的图片。我们可以明显感觉到差异。
周围的像素点是如何对当前像素点产生影响的,理论来说可以从周围一圈像素点到无穷远的像素点为当前像素点进行的影响。但是呢当我们只需要考虑周围一圈就可以解决问题时绝对不会考虑俩圈,效率问题么。
我们可以看下面这种图,垂直边界卷积核就只把垂直方向的线条给提取出来了,忽略水平方向的线条。
水平边界卷积核就只把水平方向的线条给提取出来了。
那么就是说只要我们选取的卷积核合适,最后就可以对图片实现过滤然后把想要的特征保存下来。
令x,y表示在图片上某一个点位置。那么我们得出公式:f(x, y) * g(x, y) = ∑ f(x, y) · g(m-x, n-y)
这里为了方便计算。卷积核为3*3的,只考虑周围一圈对当前像素点的影响。
对应关系应该是这样的:
f(x-1, y-1) * g(1, 1) ;
f(x, y-1) * g(x+1, 1) ;
f(x+1, y-1) * g(-1, 1) ;
f(x-1, y) * g(1, 0) ;
f(x, y) * g(0, 0) ;
f(x, y-1) * g(0, 1) ;
f(x-1, y+1) * g(1, -1) ;
f(x, y+1) * g(0, -1) ;
f(x+1, y+1) * g(-1, -1) ;
仔细发现就是刚好g表倒过来。
所以我们发现g函数不等于卷积核。因为卷积核并没有进行翻转操作。
卷积神经网络一般用来做图像识别的,就比如下面这种情况,输入x/o通过卷积神经网络(CNN)就可以识别出来他们是x还是o。
不仅可以识别整整齐齐的这种图片,就比如下面这种不规则的也可以识别。
这里我简化像素值,认为黑色是-1,白色是1。
我们可以将规则的x和不规则的x进行对比。发现虽然它们不是一模一样,但是局部是存在相同部分的。
所以卷积神经网络的第一步就是把图片的局部特征进行提取。然后将这些局部特征交给神经网络。然后由神经网络来做判别。