最近一直在看CNN,从书上网上搜集了一些资料,主要还是以前没有深入研究过,很多概念理解的都不够透彻,所以看起来比较费劲,综合上一周看的这些资料,做了一下总结。
1. 什么是CNN
CNN(Convolutional Neural Networks),卷积神经网络。属于深度学习中的一种多层网络结构模型。通过设置多个卷积层来模仿生物大脑认知由具体到抽象的过程,同时利用图像的统计特性将局部感受野获得的特征应用到整幅图像上,实现特征的隐式学习。
2. CNN的结构:
CNN为多层网络结构,主要构成为C层(卷积层)和S层(池化层)。如下图所示:
图1. CNN结构示意图
网络输入为2D图像,每一层由多个2D图像组成,每个2D图像有多个神经元。在上图中,C1,C3为卷积层,负责特征提取,S2,S4为池化层,负责特征映射。经过多层卷积池化操作,将2D图像光栅化,输入到传统神经网络,得到输出。CNN是一个隐式学习特征的过程,避免了特征的显示输入,核心是权值共享。
3. CNN的核心思想
3.1 权值共享
上面提到CNN区别于普通神经网络主要在于其权值共享特点。普通神经网络训练时每一个隐层中的神经元与上一层的连接参数都是不一样的。但是卷积神经网络通过设计一个卷积核,利用卷积核来卷积图像,实现权值的重复利用。举例来说,普通神经网络,一副8*8的图像输入,与一个神经元的链接为8*8,对于卷及神经网络,选取一个5*5的卷积核之后,连接数变为5*5+1,减少了神经网络的参数。
3.1.1为什么可以用权值共享?
因为自然图像有其固有的特性,也就是说图像的一部分统计特性与其他部分是一样的,比如边缘,在一幅图像的不同区域都会存在边缘,这意味着我们在图像的一部分区域学习到的特征也可以用到其他的区域(即感受野),所以对于图像的其他位置,我们可以使用同样的学习特征。
3.1.2权值共享的优点?
大大简化了神经网络需要训练的参数,提高计算性能。符合生物认知事物的过程。
3.2 池化
卷积获得特征,但是卷积后的特征图像仍然过大,利用图像在空间和时间上的统计特性,为了描述比较大的图像,针对不同位置的特征进行聚合统计(可以是求一个区域的最大值或平均值等),降低维度,改善结果(不容易过拟合)。这种聚合的过程就称为池化,有时候也成为平均池化或者最大池化(取决于池化的算法)。
4.CNN的训练过程
4.1CNN参数确定
CNN的具体训练过程如下(以LeNet5为例):
图2. LeNet结构图
总体结构为:输入—卷积层(C1)—池化层(s2)—卷积层(C3)—池化层(S4)—卷积层(C5)—全连接层(F6)—输出。
网络参数如下表:
输入 | 32*32像素图像 | |||||
| 核数目 | 核大小 | 参数 | 连接数 | 特征图像大小 | 特征图像数目 |
C1 | 6 | 5*5 | (5*5+1)*6 | (5*5+1)*6*28*28 | 28*28 | 6 |
S2 | 6 | 2*2 | (1+1)*6 | (2*2+1)*14*14*6 | 14*14 | 6 |
C3 | 16 | 5*5 | 1516 | 151600 | 10*10 | 16 |
S4 | 16 | 2*2 | 36 | 2000 | 5*5 | 16 |
C5 | 120 | 5*5 | 48120 | 48120 | 1*1 | 120 |
F6 |
|
| 10164 | 10164 |
|
|
输出 | 10个欧式径向基函数单元 |
值得一提的是,S2层到C3层并不为全连接,在这个模型中,C3的前6幅特征图为S2中不相邻的三幅图卷积得到,中间6幅特征图为S2中4个相邻的特征图子集为输入,接下来3幅图以不不相邻的4个特征图子集作为输入,最后一幅图与S2层全连接,故参数计算规则为(5*5*3+1)*6+(5*5*4+1)*6+(5*5*4+1)*3+(5*5*6+1)=1516。
运行结果如下图:
图3. LeNet运行结果
4.2 CNN训练过程
CNN训练采用的是BP算法,大致分为前向和反向两个阶段。
前向传播阶段:
1)取出样本集中的一个样本(X,Y)作为输入。
2)随机初始化卷积核,计算实际输出。
反向传播阶段:
1)计算实际输出与理想输出之间的差值。
2)按照误差最小二乘方法反向传播调整权矩阵。
5.CNN在工程中使用
针对不同的语言,深度学习发展了不同的库。Python下常用的有Theano,Caffe,Chainer等等。Mathlab下有ConvNet,DeepLearnToolBox,cuda-convet等。C++下有Intel Deep Learning Framework(IDLF),eblearn等。
5.1Intel Deep learning Framework简介
IDLF可使用于应用开发,云服务器开发或学术研究等。在Inter®处理器上能取得最大的运行效果。IDLF开源库使用C++APIs开发,支持的系统有Linux,Microsoft Windows,支持的C++编译器有Visual Studio 2013,GCC和ICC15。
5.2 Caffe简介
Caffe是一个深度学习框架,支持命令行、Python和Matlab,C++接口。可以在CPU和GPU之间直接无缝切换。Caffe具有运算速度快,架构友好,模块化等特点,给出了模型的定义、最优化设置以及训练的权重等,方便上手。
参考资料:
1. 《机器学习》
2. 《模式识别》
3. [CSDN Blog] Zouxy. Deep Learning(深度学习)学习笔记整理系列.2013.
4.[博客园 Blog] bzjia.Deep Learning 学习随记(八)CNN(Convolutional neural network)理解.2013.
7.Intel®Deep Learning Framework官网
接下来有时间的话会针对工程,比如Caffe的使用方面再深入下去。小白的路真的还很长。