CNN
转载自:http://blog.csdn.net/zhongkeli/article/details/51854619
在介绍CNN网络之前,我们先介绍下卷积的含义:大家学习数学时都有学过卷积的知识,微积分中卷积的表达式为:
S(t)=∫x(t−a)w(a)da
S(t)=∫x(t−a)w(a)da
离散形式是:s(t)=∑ax(t−a)w(a)
s(t)=∑ax(t−a)w(a)
这个式子如果用矩阵表示可以为:s(t)=(X∗W)(t)
s(t)=(X∗W)(t)
其中星号表示卷积。如果是二维的卷积,则表示式为:s(i,j)=(X∗W)(i,j)=∑m∑nx(i−m,j−n)w(m,n)
s(i,j)=(X∗W)(i,j)=∑m∑nx(i−m,j−n)w(m,n)
在CNN中,虽然我们也是说卷积,但是我们的卷积公式和严格意义数学中的定义稍有不同,比如对于二维的卷积,定义为:s(i,j)=(X∗W)(i,j)=∑m∑nx(i+m,j+n)w(m,n)
说白了,在图像处理中对于二维数字图像信号:某个像素坐标处的卷积结果就是卷积核矩阵中心正好覆盖在该像素上时,整个卷积核矩阵元素与覆盖下对应图像矩阵元素的乘积求和结果。
如下图:
再举一个动态的卷积过程的例子如下:
我们有上面这个绿色的5x5输入像素矩阵,卷积核是一个下面这个黄色的3x3的矩阵。卷积的步幅是一个像素。则卷积的过程如下面的动图。卷积的结果是一个3x3的矩阵,因为卷积核的中心不能覆盖边界,否则卷积部分元素会出界。这样对于m*m的像素矩阵和n*n的卷积核,卷积输出都是(m-n+1)*(m-n+1)。
总结:卷积的结果就是将一幅图像转化为另一幅图像,转化后的图像保留了原图像重要的特征,同时去掉了冗余,从而用于最后的分类。
CNN网络结构
下面以一种典型卷积网络结构LeNet-5(用来识别数字的卷积网络)为例来介绍CNN网络,结构图如下(来自Yann LeCun的论文):
在卷积神经网络算法的一个实现文章中,有一个更好看的图:
该图的输入是一张28*28大小的图像,在C1层有6个5*5的卷积核,因为C1层输出6个(28-5+1)(28-5+1)大小的feature map。然后经过子采样层,这里假设子采样层是对卷积层的均值处理(mean pooling), 其实一般还会有加偏置和激活的操作,为了简化,省略了这两步,只是对卷积层进行一个采样的操作。因此S2层输出的6个feature map大小为(24/2)(24/2).在卷积层C3中,它的输入是6个feature map,与C1不一样(C1只有一个feature map,如果是RGB的话,C1会有三个channel)。C3层有12个5*5卷积核,每个卷积核会与上一层的6个feature map分别做卷积(事实上,一般是选择几种输入feature map来做卷积,而不是全部的feature map),然后对这6个卷积结果求和组成一个新的feature map,即该层会有12个大小为(12-5+1)*(12-5+1)的feature map,这个feature map是经过sigmod 函数处理然后结果下一层S4。
同理,S4层有12个(与卷积层的feature map数一致)大小为(8/2)*(8/2)的feature map。输出层把S4层的feature mapflatten一个向量,向量长度为12*4*4=192,以该向量作为输入,与下面的其它层全连接,进行分类等操作,也就是说把一张图片变成一个向量,接入到别的网络,如传统的BP神经网络,不过从整体来看,CNN可以看做是一个BP神经网络。在 这里有两张很生动的图来描述这个过程:
权值共享理解
从代码的实现来看,每个卷积核会与部分或全部的输入(上一层输出)feature map进行卷积求和,但是每个卷积核的权重与一个feature map是一一对应,如上一章节中的C3-S4,说是有12个卷积核,然后就有12个输出feature map,但是每个卷积核与输入的6个feature map的权重都是不一样,即kernel不一样,也就是说每个卷积核的权重与一个feature map是一一对应。至于权值共享的话,对于同一个输入的feature map的神经元patch,用的是同一个卷积核权重,这个是共享的,只在同feature map共享,不在跨feature map共享,只是个人理解,有可能有错,if wrong please correct me.