您的位置:首页 > 理论基础 > 计算机网络

对卷积神经网络(CNN)的简单理解

2016-05-26 20:43 627 查看
之前简单的了解过cnn的简单的网络结构,但是对于其中的一些概念都不是很了解,但是最近学tensorflow看源码的时候真的很吃力,啥都看不懂,所以今天下午把cnn详细的看了一下,虽然最近很忙,还是要整理一下思路,算是今天下午的学习成果,本文主要参考两篇博文分别是:
http://blog.csdn.net/zouxy09/article/details/8781543/ http://blog.csdn.net/abcjennifer/article/details/25912675
下面我将结合LeNet-5的网络结构来解释一下一些常见的概念:



输入input: 32 * 32 的图像

需要第一次卷积(C1层): 特征提取层,每个神经元的输入与前一层的局部感受野相连,并提取该局部的特征,一旦该局部特征被提取后,它与其他特征间的位置关系也随之确定下来

然后注意C1 层的时候是用了6种 5x5的卷积核(滤波器)(注解1),每一种卷积核都能提取一张特征图(feature
map), 也就是说有多少种不同的卷积核,就会多少个不同的feature
map, 因为不同的卷积核可以进行不同的特征提取(注解2),当然这里的feature的数量是根据你自己的需求而定的,一般图像很大的话会需要很多的feature map, 而对于上图中32*32的图像,6个feature
map就比较合适,到这里你会问,问什么需要设计多种的滤波器,全联接的不行么? 这就是卷积神经网络最重要的特点:权值共享来减少网络参数(注解3),这时候就可以通过输入图像的大小以及卷积核的大小来确定隐含层的神经元的个数了,公式为:(32-5+1) * (32 -5 +1) =
28 * 28 个隐层神经元。也就是每一个feature map的大小就是28 * 28 。那么C1一共有 (5*5 +1)*6个参数,其中5*5为卷积核的大小,1为一个bias参数, 6为6种卷积核。

然后就是S2层, 是一个下采样层: 利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量同时保留有用信息。

有6个14*14的映射特征图。特征图中的每个单元与C1中相对应特征图的2*2邻域(感受野为2*2,并且不重叠)相连接。S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid函数计算。
那么就是(1+1)* 6 = 12  个可训练参数, 第一个1为2*2的区域的4个像素相加 * 1个参数,而每一个2*2区域的一个参数都是相同的(跟所有的额卷积核的参数都相同类似,不过这个地方并不是卷积核和各个元素都连接,而是相加之后只有一条边), 第二个2是每一个feature都有一个相同的bias(跟C1层类似),然后乘6就是6张feature map。

然后就是C3层, 16种5*5的的卷积核,得到16张10*10的feature map, 其他的跟C1一样

然后是S4层, 下采样得到 16张5*5的feature map.

S-层可看作是模糊滤波器,起到二次特征提取的作用。隐层与隐层之间空间分辨率递减,而每层所含的平面数递增,这样可用于检测更多的特征信息。

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

F6层有84个单元(之所以选这个数字的原因来自于输出层的设计),与C5层全相连。有10164个可训练参数。如同经典神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置。然后将其传递给sigmoid函数产生单元i的一个状态。
      最后,输出层由欧式径向基函数(Euclidean Radial Basis Function)单元组成,每类一个单元,每个有84个输入。换句话说,每个输出RBF单元计算输入向量和参数向量之间的欧式距离。
----OK
以上就是此时对cnn的理解,具体的实现还没做,做的时候估计还有很多细节的问题,但时候再来补充。

注解1: 积核(滤波器, 在图像应用中称为卷积核)的设计准则:

      1)滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。
      2)滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。当然了,这不是硬性要求了。
      3)如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。
      4)对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。

注解2: 不同卷积核可以进行不同的特征提取,比如:

保持原图像:[ [0,0,0], [0 ,1, 0], [0, 0 ,0]  ]

图像锐化滤波器: [
[-1,-1,-1], [-1 ,8+1, -1], [-1,-1 ,-1]  ]

边缘检测滤波器: [
[-1,-1,-1], [-1 ,8, -1], [-1,-1 ,-1]  ]

还有一些其他的,由于不是专业学图像的,这里只是介绍一下卷积核的重要性,不同的卷积核可以针对不同的特征进行提取,这里主要参考:
http://blog.csdn.net/zouxy09/article/details/49080029
注解3:  cnn中如何实现权值共享来大大的减少网络训练的参数

如果我们有1000x1000像素的图像,那么就有有10^6个隐层神经元,那么他们全连接的话(每个隐层神经元都连接图像的每一个像素点),就有1000x1000x1000000=10^12个连接,也就是10^12个权值参数。然而图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。这样,我们就可以减少连接的数目,也就是减少神经网络需要训练的权值参数的个数了。如下图右:假如局部感受野是10x10(1000*1000的图片用10*10的卷积核去进行不重叠的卷积,那么步长就是10,
那么相当于有100*100个卷积核,就有这么多神经元,那么如果把步长改为8呢?用10*10卷积核在1000*1000的图像上每次走8,然后就是((1000/8-1)*((1000/8)-1)= 124 * 124 个隐层神经元,当然这并不是公式,只针对这种步长是8的适用,然后每行剩下8个像素点没法卷积),隐层每个感受野只需要和这10x10的局部图像相连接,那么就是10^6
* (10*10) = 10^8 个权值,这样虽然减少了四个数量级,但是数量还是非常巨大。



但是我们如果把每一个神经元到10x10 的像素区域的权值都设置为一样的,即每个神经元都用同一个卷积核去卷积这个图像,这样的话只需要10 X 10 个权值就OK,但是这样真的能很好的提取特征吗? 答案是否定的,此时我们需要用不同的卷积核得到不同的特征图,如果采用100种不同的卷积核的话,那么总的参数也只需要100 * 100 = 10000个参数。

知识点补充: 

anchor是先将图片,切成n*n的块,在每个块上,anchor变成不同形状和大小,比如faster rcnn是9个.

框回归,是输出结果有cx,cy,w,h,即中心点,和宽高

简单的说,是先将图片(请问这个图片是原始图片还是卷积以后的图片),切成n*n的块,然后在这些块附近增加一些窗宽比有所变化的紧邻块,

以这些块作为初始的目标框进行框回归迭代,逐步精确确定目标的位置, 然后投入到神经网络训练,判断这个anchor的范围下是不是物体,原始图片是800*600,切成36*36的块,要求卷积核最后一层输出36*36*anchorsize*outnum

最近经常看到一些max pool层的feature map是6,输出的feature map是16, 一直不理解feature map可以不是倍数关系:

你用一个核,然后卷6个通道,然后相加,然后激活函数,就是你这个核在这个点所得到的卷积值, 也就是说用一个核一块去卷积6张图片,用16个核去卷积得到16张feature map.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CNN 卷积神经网络