cs231n-有关CNN的介绍、细节
一、卷积神经网络介绍:
卷积神经网络是一种多层神经网络,擅长处理图像特别是大图像的相关机器学习问题。
卷积网络通过一系列方法,成功将数据量庞大的图像识别问题不断降维,最终使其能够被训练。CNN最早由Yann LeCun提出并应用在手写字体识别上(MINST)。LeCun提出的网络称为LeNet,其网络结构如下:
这是一个最典型的卷积网络,由卷积层(conv)、池化层(pooling)、全连接层(FC)组成。其中卷积层与池化层配合,组成多个卷积组,逐层提取特征,最终通过若干个全连接层完成分类。
卷积层完成的操作,可以认为是受局部感知的启发,而池化层,主要是为了降低数据维度。
综合起来说,CNN通过卷积来模拟特征区分,并且通过卷积的权值共享及池化,来降低网络参数的数量级,最后通过传统神经网络完成分类等任务。
二、卷积神经网络细节:
1.Filter的产生及作用
假设输入的图片格式是32*32*3,过滤器(Filter)的大小为5*5*3,需要注意原始输入数据和过滤器的深度一般是一样的。
注:过滤器(Filter)和卷积核(Kernel)基本同义
2.Filter的一些特性
令这个5*5*3的过滤器(Filter)“扫过”输入32*32*3的输入数据,具体过程就是两个5*5*3的向量做点乘运算,可以得到一个28*28*1的**图像(Activation Map),需要注意的是,通常情况下过滤器(Filter)的数量不止一个,而过滤器的数量就决定了**图像(Activation Map)的层数。
3.输入层与Filter、填充层(Padding)、步长(Stride)、和输出层的关系
有时候我们并不想每一列都进行过滤器的“滑动(slide)”,于是我们有了步长(stride)这个参数,其值等于两个相邻Filter划过位置的坐标差。
并且从上图可以看到,数据会因为卷积操作而变得越来越小(32*32->28*28),这样会导致数据特征太过粗糙而无法分析,所以我们想到可以在数据周围填充0,这样经过处理后,图像的大小并不会变。至于填充0的原因,我认为的解释是不想对点乘的结果产生不必要的影响,也有人认为应该填充边界近似的值,但事实证明填充0的效果已经非常优秀。
这样我们就有了几个参数:
1).Filter的个数K
2).Filter的大小F(上例中使用了5*5,一般都使用奇数大小的过滤器)
3).步长(Stride)S
4).0填充层(zero padding)的层数P
下图是来自cs231n的一张幻灯片,写明了这些参数之间的关系:
其中W1、H1、D1为原始数据大小,W2、H2、D2为经过卷积后的数据大小
总参数个数由Filter定义及Filter个数决定,公式为:The number of parameters = (FxFxD + 1) * K
4.Pooling(池化)过程
通过上图可以发现,卷积神经网络中除了不断的卷积(conv)以及**(默认用relu函数)之外,还有池化(pooling)操作。
Pooling层一般用于降维,将一个k*k的区域内取平均(average pooling)或取最大值(max
pooling),作为这一个小区域内的特征,传递到下一层。这样可以使数据的特征更加明显,提取特征变得更加容易且高效。
下图是对池化过程的解释以及一些参数的关系:
5.所有的操作完毕后,网络会经过若干个全连接层(FC-Fully Connected)