卷积、卷积操作、卷积神经网络?大家初次见到这些概念是怎么想的呢?对于初次理解卷积神经网络来说,只知道他是如何工作的,如何计算的,但是不知道为什么通过这样的计算就可以达到想要的效果,心里总是有个疙瘩,就像图片中就一个个RGB值,为什么通过卷积神经网络就会被提取出来了呢?对于这些问题,是我学习深度学习一年来的困惑。今天就梳理一下思路从底层去解决这个问题。

卷积?卷积操作?

我们用蝴蝶效应类比卷积操作,蝴蝶在X时刻煽动翅膀,他会对t时刻发生飓风产生影响,但是这个影响它是会随着时间的变化而减弱,具体减弱就是g()函数。我们可以这样理解卷积,在某一时刻发生了一件事,他会收到之前发生的很多事的影响,这不就是周围像素点对当前像素点的影响吗,而蝴蝶相应的g()函数是随着时间而影响的,那图像的g()函数则是根据位置而影响的。

卷积核到底是在干什么,里面的数字不一样,处理的效果也是不一样。他其实就是规定了周围的像素点是如何对当前像素点产生影响的,如:3*3卷积核其实就是规定了周围1圈像素点对当前像素点产生的影响。卷积就是过去对现在的影响,周围像素点对当前像素点的影响。

卷积核还有一个功能,就是一个过滤器,只要挑选的卷积核合适,最后就可以对图片进行过滤,把想要的特征保存下来,其实这个相乘再相加也可以看成当前像素点对周围像素点的试探,而卷积核就是试探的模版,当不想考虑某个位置的时候,就可把它设置成0。

在这种情况下他就是对周围像素点的一个主动的试探和选择,通过卷积核把它周围有用的特征保留下来。这也就是我们上面说的一个卷积核就代表一个特征/模式。接下来神经网络(全连接网络)就可以通过对这些特征信息的判断进行图像识别。

卷积神经网络的底层原理

问题一:为什么加上卷积神经网络以后,对图像特征的位置信息就不那么敏感了呢?

首先说全连接网络,他的隐藏层可以看作对原始图像的数据进行了抽象,先把其中的特征给抽象出来,然后再根据特征的线性组合(再通过激活函数增加非线性),去判断图像。

对于一个图像,很难说一个像素就是一个特征,一个图像里面他到底是什么,不是一个像素点具体的RGB值决定的,而是一个像素点和周围其他像素点的相对关系决定的(图像中的有意义信息通常通过像素点之间的相对关系和模式来捕捉),这个类似于我们一个句子的含义,不是由单个字决定的,而是这个这个字的上下文信息决定的。那么我们把图片输入到全连接神经网络之前,先对原始数据进行一个预处理,让每个像素点保存的不再是和图片特征关系不大的RGB数值,而是一个它和周围像素点存在关系的特征值,这样全连接网络就能进行他更擅长的事情了,直接对特征进行组合,然后进行判断,这个过程就是卷积要做的事情。

如果把像素点直接输入到全连接神经网络,最大的问题就是它识别出来的特征和像素点的具体位置是绑定的,很难被复用(例如图片中的花瓣,左边的花瓣和右边的花瓣具有的特征是相同的,但是神经网络却没有办法将它复用,只能把它们分别看作不同的特征),如果每个像素点本身保存的数值就是它和周围像素点的关系,就能避免这一点。(当特征表示的是局部关系而不是绝对值时,相同的特征可以在不同位置被复用。)

我们将这个图片分割成不同的模式,这些模式就是一个一个的特征。下面就是特征值。

而这个特征用数据的方式呈现出来就是卷积核。这些值就是卷积核和图像计算出的结果。

特征值就是在定量的表示这个原始数据里面的具有这个特征的强弱。但是特征和特征之间他们是没有办法直接比较、直接的定量表现的。也就是说,不同特征的特征值他们互相之间是不能公度的。(在特征表示中,来自不同特征的特征值之间没有直接的可比性或一致的度量标准。每个特征可能代表不同的量纲或测量单位,因此直接比较或结合它们可能没有意义或是误导性的。)

下面的问题就是特征值如何计算,以及如何将这些特征值集中到一个像素点中。(答案就是,可以通过加权求和的方式W1*0.9+W2*0.01+W3*0.01+W4*0.05+···,这些系数可以靠机器学习的算法得出自动学习到合理的数值,RGB数值也是一样的原理。)

基于这样加工后的数据在输入到神经网络里面,神经网络用来判断的依据就不再是像素点的绝对位置了,而是相对位置,加工后的数据和RGB形式上没有本质的区别,所以就可以对已经处理的数据进行反复同样的操作,让相对位置的特征抽象程度可以更高,一个像素点的数据可以体现更大范围的特征(也叫做增大感受野),卷积神经网络可以吧多个卷积层叠在一起就是根据这一点。

如何用计算机懂得方式把这个特征表示出来,还能用这个特征把图像的特征计算出来?

接下来我们就从傅里叶变换的角度切入。

切入一:傅里叶变换

讲傅里叶变换,肯定离不开时域和频域这两个概念(信号系统的常用概念)这里给大家举一个生活中的例子方便理解,在你的理解中,一段音乐是什么呢?

这是我们对音乐最普遍的理解,一个随着时间变化的震动。但我相信对于乐器小能手们来说,音乐更直观的理解是这样的:

上图是音乐在时域的样子,而下图则是音乐在频域的样子,它变成了一个个离散的音符。所以频域这一概念对大家都从不陌生,只是从来没意识到而已。

傅里叶同学告诉我们,任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。在第一个例子里我们可以理解为,利用对不同琴键不同力度,不同时间点的敲击,可以组合出任何一首乐曲。

而贯穿时域与频域的方法之一,就是传中说的傅里叶分析。傅里叶分析可分为傅里叶级数(Fourier Serie)和傅里叶变换(Fourier Transformation),我们从简单的开始谈起。

我们可以把图像的像素点的位置堪称这个空间里的坐标轴,像素点的RGB数值就是第三根坐标轴。

这样的话这个信号的周期就不是用时间来表示了,而是像素点之间的距离。

在频域中的一个点F(w),对应的就是时域中的整条曲线(正无穷到负无穷的积分),也就是把时域里的全域信息给进行了浓缩(看公式)

这也就是我们刚才说的,想要把图片里的一个像素点和他周围其他的像素点的关系浓缩到一个点上的方法,到这里,大家有没有一种醍醐灌顶的感觉。

我们可以把不同w的取值看成不同特征,就是不同频率的正弦余弦信号,这个特征值就是傅里叶级数F(w)的取值,把所有特征和它对应的特征值直接想乘,就代表这个模式在原信号中的强弱,把所有特征都考虑进来,那么就能把原信号还原出来(特征与特征值相乘再相加),因此这就是逆傅里叶变换。

以下是对傅里叶级数和变换的数学推导,大家可以一步一步跟着算一下,可以理解一下傅里叶变换在频域上如何从离散谱变成了连续谱,也就是非周期函数的傅里叶变换:

问题二:我们需要的是局部信息而不是全局信息。而傅里叶变换总是从全局去看。

因为傅里叶变换总是从全局去看,那样如果一个图像里有两朵花与图像里有一朵花相比,就会有本质的不同,而我们的目的是要求把图像里的花识别出来,所以我们更需要局部特征。

给傅里叶变换加上约束,叫做加窗傅里叶变换。而卷积就可以看成一个二维的加窗傅里叶变换。具体如何理解呢?

我们让一个二位曲线升维,升到∞维,那么在这个二位曲线在这个∞维坐标系中就会变成一个点,图像也是这个道理,只要他的纬度有限,都可以降维到一点。这其中的好处就是这个点还可以用向量来进行等价表示。

e^{^{iwt}}前面增加一个函数s=g(t-s)\ast e^{_{iwt}}

这就是一个高斯分布的函数,高斯分布的图像就是一个小鼓包,这个小鼓包就相当于一个窗口,这里a相当于是方差,也就是由他来决定窗口的大小,其中s是期望,由他来决定窗口的位置。这就是Gabor变换。

我们的目标有两个,第一个就是这个特征要和位置无关,相同的特征要有相同的特征值。

第二个目标我们需要的是局部信息而不是全局信息。

切入点二:Gabor变换

原始图像对应的是黄色的f(t)函数,相当于是时域里的信号,右边的点阵是变换后的红色F(n,s)函数,绿色像素点的位置就是s,接着把右边像素点的信息展开。

我们把右边的一个像素点的信息展开,他就是包含着各种卷积核计算的结果,不同卷积核代表的是不同的模式(特征),不同模式的编号对应的是变量n,卷积核下面具体的特征值,就是F(n,s)函数具体的值,卷积核的中心就是变换结果里面的那个位置S,所以卷积核的大小就是窗口的大小,卷积核具体的数值,也就是窗口里集体的波形是什么,这个不需要我们人为的去发现,都是要卷积神经网络自己学习得到的,因为用卷积核进行计算本质上也是一种线性计算,所以一个卷积核里面它的参数具体是多少,通过梯度下降法就都能学习到,此时Gabor变换就是一个切入点,实际上的卷积核它不一定是高斯分布。

到这里卷积神经网络的背后底层原理就结束了,大家都是知道卷积操作就是原始图像f()与卷积核g()的相乘相加,但是为什么经过这样的操作以后,就可以进行特征提取,相信大家读完这篇文章以后就会理解。

【从“卷积”、到“图像卷积操作”、再到“卷积神经网络”,“卷积”意义的3次改变】https://www.bilibili.com/video/BV1VV411478E?vd_source=5cf529a201b5af97716ff155741f5060

【纯干货数学推导_傅里叶级数与傅里叶变换_Part1_三角函数的正交性】https://www.bilibili.com/video/BV1Et411R78v?vd_source=5cf529a201b5af97716ff155741f5060

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐