理解CNN

  最近,随着人工智能的发展,神经网络已经成为一个热门话题技术,下面我们来理解下CNN

首先我们了解一下什么是卷积:


卷积能够得到图像的某些特征信息,了解图像处理的人都知道,我们通过卷积可以对图像进行锐化或者模糊,其实是相同的原理,和某些模板卷积操作可以凸显图像的某些特征。

首先我们想象:针对一个神经元,一幅640*360图像,一个神经元要对应640*360个像素点,即一个神经元对应全局图像,全连接的话一个神经元就有640*360个参数。这是一个可怕的数字。然而,图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些不同局部的神经元综合起来就可以得到全局信息。假如每个局部感受野10*10,每个局部感受野只需要和10*10的局部图像连接,这样一个神经元就只需要10*10个参数;


全局图像是640*360,但局部图像只有10*10大小,10*10个参数只针对局部图像,如果全局图像中各个局部图像之间权值共享的话,即10*10个参数在不同局部图像上参数应用相同的话,则在全局图像上通过全局共享则只需要10*10个参数;这就是CNN的魅力。本来那么大数据量的权值变成了少数据量的权值。

由于只有一个滤波器,只提取了一种特征,特征也太少了。一种滤波器也就是一种卷积核就是提取图像一种特征,例如某个方向的边缘。那么我们需要提取不同特征怎么办,多加几个滤波器不就行了。假设我们加到100种滤波器,每种滤波器的参数不一样,表示提取输入图像不同特征,例如不同边缘。这样不同滤波器去卷积图像就得到不同特征的放映,我们称之为Feature Map,所以100中卷积核就有100个Feature Map,这100个Feature Map就组成了一层神经元。我们这一层有多少个参数到这时候就明了吧,100种卷积核  *   每种卷积核100个参数  = 100 * 100 = 10000个参数。





我们可以看到1 ,2...一直到m 就是采用不同滤波器得到的Feature Map






这下你可能对卷积减少参数的概念已经比较了解了,可是共享权值是什么共享呢?从下图中我们知道共享权值中的共享指的是滤波器某个位置的所有权值是相同的




最后,刚才说每一个隐藏层的参数个数和隐藏层的神经元个数无关,只和滤波器大小和滤波器种类数有关,那么隐藏层的神经元个数怎么确定呢?它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关!假如我的图像是1000*1000像素的,而滤波器大小是10*10,假设步长为10,即滤波器没有重叠,这样隐藏层的神经元个数就是 1000 * 1000 / (10*10) = 100*100个神经元(如果步长为8,卷积核会重叠2个像素)。这只是一种滤波器,也就是一个Feature Map的神经元个数哦,如果100个Feature Map就是100倍了,

池化,简言之,即取区域平均或最大,如下图所示



当然你也可以做其他操作,比如找最小、求平均。




下面以最经典的LeNet-5例子来逐层分析各层的参数及连接个数。

         

     

   C1层是一个卷积层,由6个特征图Feature Map构成。特征图中每个神经元与输入为5*5的邻域相连。特征图的大小为28*28,这样能防止输入的连接掉到边界之外(32-5+1=28)。C1有156个可训练参数(每个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器,共(5*5+1)*6=156个参数),共156*(28*28)=122,304个连接。


        S2层是一个下采样层,有6个14*14的特征图。特征图中的每个单元与C1中相对应特征图的2*2邻域相连接。S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。每个单元的2*2感受野并不重叠,因此S2中每个特征图的大小是C1中特征图大小的1/4(行和列各1/2)。S2层有12(6*(1+1)=12)个可训练参数和5880(14*14*(2*2+1)*6=5880)个连接。


          C3层也是一个卷积层,它同样通过5x5的卷积核去卷积层S2,然后得到的特征map就只有10x10个神经元,但是它有16种不同的卷积核,所以就存在16个特征map了。 C3中每个特征图由S2中所有6个或者几个特征map组合而成。为什么不把S2中的每个特征图连接到每个C3的特征图呢?原因有2点。第一,不完全的连接机制将连接的数量保持在合理的范围内。第二,也是最重要的,其破坏了网络的对称性。由于不同的特征图有不同的输入,所以迫使他们抽取不同的特征(希望是互补的)。


      例如,存在的一个方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。然后的3个以不相邻的4个特征图子集为输入。最后一个将S2中所有特征图为输入。这样C3层有1516(6*(3*25+1)+6*(4*25+1)+3*(4*25+1)+(25*6+1)=1516)个可训练参数和151600(10*10*1516=151600)个连接。


       S4层是一个下采样层,由16个5*5大小的特征图构成。特征图中的每个单元与C3中相应特征图的2*2邻域相连接,跟C1和S2之间的连接一样。S4层有32个可训练参数(每个特征图1个因子和一个偏置16*(1+1)=32)和2000(16*(2*2+1)*5*5=2000)个连接。


        C5层是一个卷积层,有120个特征图。每个单元与S4层的全部16个单元的5*5邻域相连。由于S4层特征图的大小也为5*5(同滤波器一样),故C5特征图的大小为1*1(5-5+1=1):这构成了S4和C5之间的全连接。之所以仍将C5标示为卷积层而非全相联层,是因为如果LeNet-5的输入变大,而其他的保持不变,那么此时特征图的维数就会比1*1大。C5层有48120(120*(16*5*5+1)=48120由于与全部16个单元相连,故只加一个偏置)个可训练连接。


       F6层有84个单元(之所以选这个数字的原因来自于输出层的设计),与C5层全相连。有10164(84*(120*(1*1)+1)=10164)个可训练参数。如同经典神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置。然后将其传递给sigmoid函数产生单元i的一个状态。


      最后,输出层由欧式径向基函数(Euclidean Radial Basis Function)单元组成,每类一个单元,每个有84个输入。

             

卷积和子采样过程:卷积过程包括:用一个可训练的滤波器fx去卷积一个输入的图像(第一阶段是输入的图像,后面的阶段就是卷积特征map了),然后加一个偏置bx,得到卷积层Cx。子采样过程包括:每邻域四个像素求和变为一个像素,然后通过标量Wx+1加权,再增加偏置bx+1,然后通过一个sigmoid激活函数,产生一个大概缩小四倍的特征映射图Sx+1。



本文旨在帮助大家直观去理解CNN,特别是CNN在减少权值数量的优势。


猜你喜欢

转载自blog.csdn.net/B1009/article/details/72677152