一、卷积层

1.卷积操作

2.特征提取—"X" or "O"?

二、池化(Pooling)

三、Relu 层

四、全连接层(Fully connected layers)

五、反向传播算法BP

六、总结


       作为机器学习的一个分支,深度学习同样需要计算机获得强大的学习能力,那么问题来了,我们究竟要计算机学习什么东西?答案当然是图像特征了。将一张图像看做是一个个像素值组成的矩阵,那么对图像的分析就是对矩阵的数字进行分析,而图像的特征,就隐藏在这些数字规律中。

       当你听到说深度学习打破了某项新技术障碍,那么十有八九就会涉及到卷积神经网络。它们也被称作CNNs或着ConvNets,是深层神经网络领域的主力。它们已经学会对图像进行分类,在某些情况下甚至超过了人类。如果有一个方法证明了这种假设,那就是CNN。特别酷的一点就是,当你将它们分解为基本模块时,它们很容易被理解。这里有一个视频,很详细地讨论了关于这些图像问题。

                                                   

                                                                         LeNet-5架构

                                     

                                                                                 图像分类

如果动画失效,原文链接:https://www.jianshu.com/p/fe428f0b32c1

     图像处理都是小 patchs ,比如28*28或者36*36之类,考虑如下情形,对于一副1000*1000的图像,当隐层也有106节点时,那么W(1)(第一层链接权值)的数量将达到10^12级别,为了减少参数规模,加快训练速度,CNN应运而生。CNN有几个重要的点:局部感知、参数共享、池化。

 局部感知

(让一个小块对应一个神经元,计算出的一个像素就是一个神经元,一张图片由无数个神经元铺满)
       一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。每个隐含单元仅仅连接输入单元的一部分。例如,每个隐含单元仅仅连接输入图像的一小片相邻区域。对于一个输入与隐层均有  的网络,假设每个隐含单元只与 10*10 的输入区域相连接,这时参数的个数变为 10^6= 10^8,10^4个数量级,这样训练起来就没有那么费力了。这一思想主要受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激),此外图像的像素也是局部时空相关的。

      如下图所示,左边就是全连接网络,每个隐藏神经元与每个像素进行连接。右边就是部分连接网络,每个隐神经元只与一部分区域相连接。右边的图进行的便是卷积操作,该操作会生成一副 feature map 。

                

参数共享

      尽管减少了几个数量级,但参数数量依然较多。能不能再进一步减少呢?能!方法就是权值共享。具体做法是,在局部连接中隐藏层的每一个神经元连接的是一个 10×10 的局部图像,因此有10×10 个权值参数,将这 10×10 个权值参数共享给剩下的神经元,也就是说隐藏层中所有神经元的权值参数相同,那么此时不管隐藏层神经元的数目是多少,需要训练的参数就是这 10×10 个权值参数(也就是卷积核(滤波器)的大小),如下图。这样来参数真的是极大的简化了啊!这个思想主要来源于:自然图像有其固有特性,也就是说,图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。

    

单核单通道卷积

     如果隐神经元与其连接的100个输入单元具有相同的100个参数,那么就相当于是一个 10*10 的模板在原始的输入图像上做卷积(当然需要加上一个偏置参数b),这样相当于得到一个新的图像,新图像的大小为(1000-100+1)*(1000-100+1),因此也得名卷积神经网络。这样的10*10的模板,我们也把它称为一个卷积核。以下为单个卷积核示意图:

                                                     

多核单通道卷积

      CNN中只用一个卷积核提取得到的特征往往是不充分的,只能算作是一种类型的特征(比如某个方向的边缘),如果我们要提取其它方向的边缘,那就多弄几个卷积核,这样就变成了多卷积核了。假设有k个卷积核,那么可训练的参数的个数就变为了k×10×10。注意没有包含偏置参数。每个卷积核得到一副特征图像也被称为一个Feature Map。卷积的过程也被称为特征提取的过程,多核卷积中,隐层的节点数量为: k×(1000-100+1)×(1000-100+1) 。

多核多通道卷积

     当图像为RGB或ARGB(A代表透明度)时,可以在多通道进行卷积操作,或者对于堆叠卷积层来说, pooling 层之后可以继续接下一个 卷积层,对 pooling 层多个Feature Map 的操作即为多通道卷积,下图为两个卷积核在ARGB四通道上进行卷积操作,在生成对应的 Feature Map 时,这个卷积核对应4个卷积模板(这一个卷积核对应的四个模板都不一样),分别用4种不同的颜色表示,Feature Map 对应的位置的值是由四核卷积模板分别作用在4个通道的对应位置处的卷积结果相加然后取激活函数得到的,所以在四通道得到2通道的过程中,参数数目为 4×2×4个,其中4表示4个通道,第一个2表示生成2个卷积核,最后的4表示卷积核大小。见下图:

                 

参考:https://blog.csdn.net/kaido0/article/details/53161684


         深度学习对外推荐自己的一个很重要的点——深度学习能够自动提取特征。本文主要介绍卷积层提取特征的原理过程,文章通过几个简单的例子,展示卷积层是如何工作的,以及概述了反向传播的过程,将让你对卷积神经网络CNN提取图像特征有一个透彻的理解。那么我们首先从最基本的数学计算——卷积操作开始。

一、卷积层

1.卷积操作

假设有一个5*5的图像,使用一个3*3的卷积核(filter)进行卷积,得到一个3*3的矩阵(其实是Feature Map,后面会讲),如下所示:

                                          

       为了清楚的描述卷积计算过程,我们首先对图像的每个像素进行编号,用x_{i,j}表示图像的第i行第j列元素;对filter的每个权重进行编号,用w_{m,n}表示第m行第n列权重,用w_{b}表示filter的偏置项;对Feature Map的每个元素进行编号,用a_{i,j}表示Feature Map的第i行第j列元素;用f表示激活函数(这个例子选择relu函数作为激活函数)。然后,使用下列公式计算卷积:

                                          

例如,对于Feature Map左上角元素a_{0,0}来说,其卷积计算方法为:

 

计算结果如下图所示:

                            

接下来,Feature Map的元素a_{0,1}的卷积计算方法为:

 

计算结果如下图所示:

                          

因此可以依次计算出Feature Map中所有元素的值。

下面的动画显示了整个Feature Map的计算过程:(其实就是简单的点乘运算):          

                                图2 卷积计算

上面的计算过程中,步幅(stride)为1。步幅可以设为大于1的数。例如,当步幅为2时,Feature Map计算如下:

                           

      我们注意到,当步幅设置为2的时候,Feature Map就变成2*2了。这说明图像大小、步幅和卷积后的Feature Map大小是有关系的。事实上,它们满足下面的关系:

                                           

         在上面两个公式中,W2是卷积后Feature Map的宽度;W1是卷积前图像的宽度;F是filter的宽度;P是Zero Padding数量,Zero Padding是指在原始图像周围补几圈0,如果P的值是1,那么就补1圈0;S是步幅;H2是卷积后Feature Map的高度;H1是卷积前图像的宽度。式2式3本质上是一样的。

                   

      说明Feature Map宽度是2。同样,我们也可以计算出Feature Map高度也是2。前面我们已经讲了深度为1的卷积层的计算方法,如果深度大于1怎么计算呢?其实也是类似的。如果卷积前的图像深度为D,那么相应的filter的深度也必须为D。我们扩展一下式1,得到了深度大于1的卷积计算公式:

                    

       在式4中,D是深度;F是filter的大小(宽度或高度,两者相同);w_{d,m,n}表示filter的第d层第m行第n列权重;a_{d,i,j}表示图像的第d层第i行第j列像素;其它的符号含义和式1是相同的,不再赘述。

       每个卷积层可以有多个filter。每个filter和原始图像进行卷积后,都可以得到一个Feature Map。因此,卷积后Feature Map的深度(个数)和卷积层的filter个数是相同的。

       下面的动画显示了包含两个filter的卷积层的计算。我们可以看到7*7*3输入,经过两个3*3*3filter的卷积(步幅为2),得到了3*3*2的输出。另外我们也会看到下图中 ,在输入元素的周围补了一圈0。Zero padding对于图像边缘部分的特征提取是很有帮助的。

                     

       以上就是卷积层的计算方法。这里面体现了局部连接权值共享:每层神经元只和上一层部分神经元相连(卷积计算规则),且filter的权值对于上一层所有神经元都是一样的。对于包含两个3*3*3的fitler的卷积层来说,其参数数量仅有(3*3*3+1)*2=56个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。

用卷积公式来表达卷积层计算,想了解太多数学细节的读者可以参考博文:  https://www.zybuluo.com/hanbingtao/note/485480。 


2.特征提取—"X" or "O"?

        一个图像矩阵经过一个卷积核的卷积操作后,得到了另一个矩阵,这个矩阵叫做特征映射(feature map)。每一个卷积核都可以提取特定的特征,不同的卷积核提取不同的特征,举个例子,现在我们输入一张人脸的图像,使用某一卷积核提取到眼睛的特征,用另一个卷积核提取嘴巴的特征等等。而特征映射就是某张图像经过卷积运算得到的特征值矩阵
       讲到这里,可能大家还不清楚卷积核和特征映射到底是个什么东西,有什么用?没关系,毕竟理解了CNN 的卷积层如何运算,并不能自动给我们关于 CNN 卷积层原理的洞见。为了帮助指导你理解卷积神经网络的特征提取,我们将采用一个非常简化的例子。    

为了帮助你理解卷积神经网络,我们讲采用一个非常简化的例子:确定一幅图像是包含有"X"还是"O"?

             

这个例子足够说明CNN背后的原理,同时它足够简单,能够避免陷入不必要的细节。

      在CNN中有这样一个问题,就是每次给你一张图,你需要判断它是否含有"X"或者"O"。并且假设必须两者选其一,不是"X"就是"O"。理想的情况就像下面这个样子:

                

   标准的"X"和"O",字母位于图像的正中央,并且比例合适,无变形

   对于计算机来说,只要图像稍稍有一点变化,不是标准的,那么要解决这个问题还是不是那么容易的:

                                            

         计算机要解决上面这个问题,一个比较天真的做法就是先保存一张"X"和"O"的标准图像(就像前面给出的例子),然后将其他的新给出的图像来和这两张标准图像进行对比,看看到底和哪一张图更匹配,就判断为哪个字母。但是这么做的话,其实是非常不可靠的,因为计算机还是比较死板的。在计算机的“视觉”中,一幅图看起来就像是一个二维的像素数组(可以想象成一个棋盘),每一个位置对应一个数字。在我们这个例子当中,像素值"1"代表白色,像素值"-1"代表黑色。

                                           

       当比较两幅图的时候,如果有任何一个像素值不匹配,那么这两幅图就不匹配,至少对于计算机来说是这样的。
       对于这个例子,计算机认为上述两幅图中的白色像素除了中间的3*3的小方格里面是相同的,其他四个角上都不同,因此,从表面上看,计算机判别右边那幅图不是"X",两幅图不同,得出结论:

                       

       但是这么做,显得太不合理了。理想的情况下,我们希望,对于那些仅仅只是做了一些像平移,缩放,旋转,微变形等简单变换的图像,计算机仍然能够识别出图中的"X"和"O"。就像下面这些情况,我们希望计算机依然能够很快并且很准的识别出来:

                         

这也就是CNN出现所要解决的问题。

feature:

        如下图所示,像素值"1"代表白色,像素值"-1"代表黑色。对于CNN来说,它是一块一块地来进行比对。它拿来比对的这个“小块”我们称之为Features(特征)。在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性,相比起传统的整幅图逐一比对的方法。每一个feature就像是一个小图(就是一个比较小的有值的二维数组)。不同的Feature匹配图像中不同的特征。在字母"X"的例子中,那些由对角线和交叉线组成的features基本上能够识别出大多数"X"所具有的重要特征。

                                

      这些features很有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体到底是怎么匹配的呢?如下三个特征矩阵a,b,c:

                         

       这些features很有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体到底是怎么匹配的呢?观察下面几张图,a可以匹配到“X”的左上角和右下角,b可以匹配到中间交叉部位,而c可以匹配到“X”的右上角和左上角。

        

 

        把上面三个小矩阵作为卷积核,就如第一部分结尾介绍的,每一个卷积核可以提取特定的特征,现在给一张新的包含“X”的图像,CNN并不能准确地知道这些features到底要匹配原图的哪些部分,所以它会在原图中每一个可能的位置进行尝试,即使用该卷积核在图像上进行滑动,每滑动一次就进行一次卷积操作,得到一个特征值。仔细想想,是否有一点头目呢?
(下图中求平均是为了让所有特征值回归到-1到1之间)

则:

                                          

对于中间部分,也是一样的操作:

                                 

最后将整张图卷积过后,得到这样的特征矩阵:

                                

然后换用其他feature进行同样的操作,最后得到的结果就是这样了:

                         

       仔细观察,可以发现,其中的值,越接近为1表示对应位置和卷积核代表的特征越接近,越是接近-1,表示对应位置和卷积核代表的反向特征越匹配,而值接近0的表示对应位置没有任何匹配或者说没有什么关联。

我们的原始图,经过不同feature的卷积操作就变成了一系列的feature map。我们可以很方便,直观地将这整个操作视为一个单独的处理过程。在CNN中,我们称之为卷积层(convolution layer),卷积核在图像上不断滑动运算,就是卷积层所要做的事情。同时,在内积结果上取每一局部块的最大值就是最大池化层的操作。CNN 用卷积层和池化层实现了图片特征提取方法。

二、池化(Pooling)

 

                                                                    

       CNN中使用的另一个有效的工具被称为“池化(Pooling)”。池化可以将一幅大的图像缩小,同时又保留其中的重要信息。池化背后的数学顶多也就是小学二年级水平。它就是将输入图像进行缩小,减少像素信息,只保留重要信息。通常情况下,池化都是2*2大小,比如对于max-pooling来说,就是取输入图像中2*2大小的块中的最大值,作为结果的像素值,相当于将原始图像缩小了4倍。(注:同理,对于average-pooling来说,就是取2*2大小块的平均值作为结果的像素值。)

 对于本文的这个例子,池化操作具体如下:

                 

经过最大池化操作(比如2*2大小)之后,一幅图就缩小为原来的四分之一了:

                        

然后对所有的feature map执行同样的操作,得到如下结果:

                                

        因为最大池化(max-pooling)保留了每一个小块内的最大值,所以它相当于保留了这一块最佳的匹配结果(因为值越接近1表示匹配越好)。这也就意味着它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。这也就能够看出,CNN能够发现图像中是否具有某种特征,而不用在意到底在哪里具有这种特征。这也就能够帮助解决之前提到的计算机逐一像素匹配的死板做法。

      当对所有的feature map执行池化操作之后,相当于一系列输入的大图变成了一系列小图。同样地,我们可以将这整个操作看作是一个操作,这也就是CNN中的池化层(pooling layer),通过加入池化层,可以很大程度上减少计算量,降低机器负载。

三、Relu 层

      这是一个很小但是很重要的操作,叫做Relu(Rectified Linear Units),或者修正线性单元。对于输入的负值,输出全为0,对于正值,原样输出。下面我们看一下本文的例子中relu激活函数具体操作:

   最后,对整幅图操作之后,结果如下:

                          

同样地,在CNN中,我们这一系列操作视为一个操作,那么就得到Relu Layer,如下:

                           

四、全连接层(Fully connected layers)

最后,我们将上面所提到的卷积,池化,激活放在一起,就是下面这个样子:

                        

然后,我们加大网络的深度,增加更多的层,就得到深度神经网络了:

                      

全连接层(Fully connected layers)

     将卷积结果排成一列向量x_{i},与输出两个神经元(“X”、“O”)全连接,这样一来就有12*2=24个连接,每个连接都有一个权重w_{i},根据y=\sum w_{i}*x_{i}分别求出两个两个神经元的输出,一般讲输出结果通过一个逻辑函数,将结果缩放到0——1之间。得到下图的结果0.92,0.51.根据结果判定为"X":

               

在这个过程中,我们定义这一系列操作为”全连接层“(Fully connected layers):

                                   

综上所述:

                          

这一整个过程,从前到后,被称作”前向传播“,得到一组输出,然后通过反向传播来不断纠正错误,进行学习。

五、反向传播算法BP

      通过上面的学习,我们知道CNN是如何利用卷积层和池化层提取图片的特征,其中的关键是卷积核表示图片中的局部特征
而在现实中,使用卷积神经网络进行多分类获目标检测的时候,图像构成要比上面的X和O要复杂得多,我们并不知道哪个局部特征是有效的,即使我们选定局部特征,也会因为太过具体而失去反泛化性。还以人脸为例,我们使用一个卷积核检测眼睛位置,但是不同的人,眼睛大小、状态是不同的,如果卷积核太过具体化,卷积核代表一个睁开的眼睛特征,那如果一个图像中的眼睛是闭合的,就很大可能检测不出来,那么我们怎么应对这中问题呢,即如何确定卷积核的值呢?
这就引出了反向传播算法

        什么是反向传播,以猜数字为例,B手中有一张数字牌让A猜,首先A将随意给出一个数字,B反馈给A是大了还是小了,然后A经过修改,再次给出一个数字,B再反馈给A是否正确以及大小关系,经过数次猜测和反馈,最后得到正确答案(当然,在实际的CNN中不可能存在百分之百的正确,只能是最大可能正确)。
        所以反向传播,就是对比预测值和真实值,继而返回去修改网络参数的过程,一开始我们随机初始化卷积核的参数,然后以误差为指导通过反向传播算法,自适应地调整卷积核的值,从而最小化模型预测值和真实值之间的误差。

以上述例子为例:

                            

梯度下降优化器:

                            
举一个简单例子。绿色箭头代表前向传播,红色代表为反向传播过程,x、y是权重参数,L为误差,L对x、y的导数表示误差L的变化对x、y的影响程度,得到偏导数delta(x)后,x* = x-η*delta(x),其中η为学习率,从而实现权重的更新。

                                                 

六、总结

      本文主要讲解基本CNN的原理过程,卷积层和池化层可以提取图像特征,经过反向传播最终确定卷积核参数,得到最终的特征,这就是一个大致的CNN提取特征的过程。考虑到反向传播计算的复杂性,在本文中不做重点讲解,先作为了解思路,日后专门再讲解反向传播的方法原理。

如何训练卷积神经网络:机器学习实战13-卷积神经网络

from:原来CNN是这样提取图像特征的。。

from:https://mp.weixin.qq.com/s/G5hNwX7mnJK11Cyr7E5b_Q

from:http://www.algorithmdog.com/cnn-extracts-feat?open_source=weibo_search&from=timeline

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐