一、卷积网络基本介绍
1.1 CNN的组成部分
卷积神经网络CNN(Convolutional Neural Network),是一类深度神经网络,最常用于分析视觉图像。一个卷积神经网络通常包括输入输出层和多个隐藏层,隐藏层通常包括卷积层和RELU层(即激活函数)、池化层、全连接层和归一化层等。
1.输入层
CNN的输入一般是二维向量,可以有高度,比如,RGB图像。
2.卷积层
卷积层是CNN的核心,层的参数由一组可学习的滤波器(filter)或内核(kernels)组成,它们具有小的感受野,延伸到输入容积的整个深度。卷积层的作用是对输入层进行卷积,提取更高层次的特征。
3.池化层
池化层(又称为下采样),它的作用是减小数据处理量同时保留有用信息,池化层的作用可以描述为模糊图像,丢掉了一些不是那么重要的特征。池化层一般包括均值池化、最大池化、高斯池化、可训练池化等。
下采样
4.激活层
激活层主要是把卷积层输出结果做非线性映射,常用的激励函数有ReLU、sigmoid、tanh、LeakyReLU等。CNN采用的激励函数一般为ReLU(The Rectified Linear Unit,修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱。
ReLU
5.全连接层
全连接层是一个常规的神经网络,它的作用是对经过多次卷积层和多次池化层所得出来的高级特征进行全连接(全连接就是常规神经网络的性质),算出最后的预测值。
6.输出层
输出层输出对结果的预测值,一般会加一个softmax层。
1.2 CNN三个核心思想:局部感知、参数共享、池化下采样。
1.局部感知
在机器识别图像时也没有必要把整张图像按像素全部都连接到神经网络中,在图像中也是局部周边的像素联系比较紧密,而距离较远的像素则相关性较弱,因此可以采用局部连接的模式(将图像分块连接,这样能大大减少模型的参数)。
2、参数(权值)共享
每张自然图像(人物、山水、建筑等)都有其固有特性,图像其中一部分的统计特性与其它部分是接近的。这也意味着这一部分学习的特征也能用在另一部分上,能使用同样的学习特征。因此,在局部连接中隐藏层的每一个神经元连接的局部图像的权值参数(例如5×5),将这些权值参数共享给其它剩下的神经元使用,那么此时不管隐藏层有多少个神经元,需要训练的参数就是这个局部图像的权限参数(例如5×5),也就是卷积核的大小,这样大大减少了训练参数。
3、池化
随着模型网络不断加深,卷积核越来越多,要训练的参数还是很多,而且直接拿卷积核提取的特征直接训练也容易出现过拟合的现象。回想一下,之所以对图像使用卷积提取特征是因为图像具有一种“静态性”的属性,因此,一个很自然的想法就是对不同位置区域提取出有代表性的特征(进行聚合统计,例如最大值、平均值等),这种聚合的操作就叫做池化,池化的过程通常也被称为特征映射的过程(特征降维)。
pooling的好处有什么?
1. 这些统计特征能够有更低的维度,减少计算量。
2. 不容易过拟合,当参数过多的时候很容易造成过度拟合。
3. 缩小图像的规模,提升计算速度。
二、过程详解
2.1 通过卷积提取图片特征
一种卷积核对应提取一种特征,为获得更多不同的特征集合,卷积层会有多个卷积核,生成不同的特征,这也是为什么卷积后的图片的高,每一个图片代表不同的特征。**每个卷积核得到一副特征图像也被称为一个Feature Map。**卷积的过程也被称为特征提取的过程。
2.1.1单核单通道卷积
2.1.2多核单通道卷积
CNN中只用一个卷积核提取得到的特征往往是不充分的,只能算作是一种类型的特征(比如某个方向的边缘),如果我们要提取其它方向的边缘,那就多弄几个卷积核,这样就变成了多卷积核了。
2.1.3 多核多通道卷积
实际上,**大多数输入图像有3个通道(RGB),而这个数字只会增加您进入网络的深度。这个时候就有了子卷积层的概念了。
2.2 池化
**通过卷积操作获得了特征 (features) 之后,下一步我们要利用这些特征去做分类。*可以用所有提取得到的特征去训练分类器,例如用这些特征训练一个 softmax 分类器,对于一个 96X96 像素的图像,假设我们已经学习得到了400个 Feature Map,每个 Feature Map 都定义在 8X8 卷积核上,每一个卷积核和图像卷积都会得到一个 (96 − 8 + 1) * (96 − 8 + 1) = 7921 维的卷积特征,由于有 400 个Feature Map,所以每个训练样例(输入图像) 都会得到一个 7921 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。
为了解决这个问题,处理大图像时,一个很自然的想法就是对不同位置的特征进行聚合统计,比如可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。池化的过程通常也被称为特征映射的过程(特征降维)
三、CNN的应用
下面来看 LeNet-5 ,用于实现手写识别的7层CNN(不包含输入层),以下为LeNet-5的示意图:
CNN的应用
输入原始图像的大小是32×32。
- C1层是卷积层,单通道下用了6个卷积核,这样就得到了6个feature map,其中每个卷积核的大小为5 * 5,用每个卷积核与原始的输入图像进行卷积
(C1层:使用6个5×5大小的卷积核,padding=0,stride=1进行卷积,得到6个28×28大小的特征图(32-5+2 * 0)/1+1=28
参数个数:(5 * 5+1)6=156,其中5 * 5为卷积核的25个参数,1为偏置
连接数: (5 * 5+1) 6 * 28 * 28=122304,其中156为卷积过程连线数,28 * 28为输出特征层每一个像素都由前面卷积得到) - S2层为 pooling 层,也可以说是池化或者特征映射的过程,拥有6个 feature map,每个feature map的大小为14 * 14,每个feature map的隐单元与上一层C1相对应的feature map的 2×2 单元相连接,这里没有重叠。
(使用2×2大小的卷积核进行池化,padding=0,stride=2,得到6个14×14大小的特征图(28-2+2 * 0)/2+1=14
参数个数:(1+1)6=12,其中第一个1为最大池化所对应的2 * 2感受野中最大的那个数的权重,第二个1为偏置。
连接数: (2 * 2+1) 14 * 14 * 6= 5880,虽然只选取2 * 2感受野中最大的那个数,但也存在2*2的连接数,即最大的权重为1,其余的为0) - C3层也是一个卷积层(多通道(14个通道)),16核卷积,注意此处C3并不是与S2全连接而是部分连接,有16个卷积核,卷积模板的大小为5*5,因此具有16个feature maps,每个feature map的大小为(14-5+1)×(14-5+1)= 10×10。
1.6个输入图如何通过卷积得到16个特征图?
每个feature map只与上一层S2中部分feature maps相连接,下表给出了16个feature maps与上一层S2的连接方式(行为S2层feature map的标号,列为C3层feature map的标号,第一列表示C3层的第0个feature map只有S2层的第0、1和2这三个feature maps相连接
如下图所示,C3的前六个特征图(0,1,2,3,4,5)由S2的相邻三个特征图作为输入,接下来的6个特征图(6,7,8,9,10,11)由S2的相邻四个特征图作为输入,12,13,14号特征图由S2间断的四个特征图作为输入,15号特征图由S2全部(6个)特征图作为输入。
2.通过S2的输入,如何卷积得到C3的一个特征图呢?
用C3层0号特征图举例,它由S2层0,1,2号特征图作为输入,由于C3层共有16个卷积核,即C3每一个特征图是由一个卷积核对S2层相应的输入特征图卷积得到的。
这里值得注意的是,上图的卷积核是一个5×5大小具有3个通道,每个通道各不相同,这也是下面计算时5 * 5后面还要乘以3,4,6卷积模板的原因。具体可参考多通道卷积。
**3.为什么要采用部分连接,而不采用全连接呢?**首先就是部分连接,可计算的参数就会比较少,其次更重要的是它能打破对称性,这样就能得到输入的不同特征集合。以第0个feature map描述计算过程:用1个卷积核(对应3个卷积模板,但仍称为一个卷积核,可以认为是三维卷积核)分别与S2层的3个feature maps进行卷积,然后将卷积的结果相加,再加上一个偏置,再取sigmoid就可以得出对应的feature map了。所需要的参数数目为(5×5×3+1)×6 +(5×5×4+1)×9 +5×5×6+1 = 1516(5×5为卷积参数,卷积核分别有 3 4 6 个卷积模板),连接数为15161010= 151600
该层使用16个55大小的卷积核,padding=0,stride=1,卷积后得到16个1010的特征图,(14-5+20)/1+1=10
参数个数:(553+1)6+(554+1)6+(554+1)3+(556+1)=1516
连接数:15161010=151600)
- S4层:依然是池化层,使用16个2×2大小的卷积核进行池化,padding=0,stride=2,得到16个5×5大小的特征图(10-2+2 * 0)/2+1=5
参数个数:(1+1)16=32
连接数: (22+1)* 16 * 5 * 5=2000 - C5层:使用120个55卷积核对S4层16个特征图进行卷积,padding=0,stride=1,得到120个11大小的特征图,(5-5+20)/1+1=1
这里的计算跟C3相同,也是多通道卷积,因此55后面乘以16.
参数个数:(5 * 5 * 16+1)* 120=48120
连接数: (5 * 5 * 16+1)* 120* 1* 1=48120 - F6层:共有84个神经元,与C5层进行全连接,即每个神经元都与C5层的120个特征图相连。
参数个数:(120+1)*84=10164
连接数: (120+1)*84=10164 - Output层:输出层由欧式径向基函数(Euclidean Radial Basis Function)单元组成,每个单元由F6层84个神经元作为输入,输出0-9十个手写数字识别的结果
参数个数:84*10=840
连接数: 84*10=840
为什么卷积核能提取特征