Press "Enter" to skip to content

让我们一起详细了解一下卷积神经网络CNN

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

作者:RayChiu_Labloy

 

版权声明:着作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

 

目录

 

回顾基于全连接的人工神经网络和深度神经网络

 

ANN和DNN原理详解请见我的另外两篇文章:

 

从浅层神经网络到深层神经网络的发展过程

 

2006年,Hinton提出了深度学习,两个主要的观点是:

 

深度学习取得成功的原因:

 

DNN和CNN等神经网络如何提取高级特征的

 

单通道图片的卷积过程和权值共享概念:

 

彩色图片三通道的卷积过程和视角概念:

 

再看一下简约版的卷积神经网络

 

CNN及之前DNN的训练过程:

 

1)数据集的大小和分块

 

回顾基于全连接的人工神经网络和深度神经网络

 

ANN和DNN原理详解请见我的另外两篇文章:

 

详细讲解深层神经网络DNN_RayChiu757374816的博客-CSDN博客

 

非常详细的讲解让你深刻理解神经网络NN(neural network)_RayChiu757374816的博客-CSDN博客

 

从浅层神经网络到深层神经网络的发展过程

 

神经网络的产生

 

1986年Rumelhart等人提出了人工神经网络的反向传播算法,掀起了神经网络在机器学习中的热潮,神经网络中存在大量的参数,存在容易发生过拟合、训练时间长的缺点,但是对比Boosting、Logistic回归、SVM等基于统计学习理论的方法(也可以看做具有一层隐层节点或不含隐层节点的学习模型,被称为浅层模型)来说,具有较大的优越性。

 

浅层学习模型通常要由人工的方法来获得好的样本特性,在此基础上进行识别和预测,因此方法的有效性在很大程度上受到特征提取的制约,因此浅层模型效果没有深层模型好。

 

2006年,Hinton提出了深度学习,两个主要的观点是:

 

1.多隐层的人工神经网络具有优异的特征学习能力,学习到的数据更能反映数据的本质特征有利于可视化或分类

 

2.深度神经网络在训练上的难度,可以通过逐层无监督训练有效克服,

 

深度学习取得成功的原因:

 

1.大规模数据(例如ImageNet):为深度学习提供了好的训练资源

 

2.计算机硬件的飞速发展:特别是GPU的出现,使得训练大规模上网络成为可能

 

深度学习的思想:

 

深度神经网络的基本思想是通过构建多层网络,对目标进行多层表示,以期通过多层的高层次特征来表示数据的抽象语义信息,获得更好的特征鲁棒性。

 

DNN的问题

 

DNN虽然可以很好的解决很多问题了,但仍然存在很多的问题,其中最主要的就是BP求解可能造成的梯度消失和梯度爆炸.那幺,人们又是怎幺解决这个问题的呢?卷积神经网络(Convolutional Neural Networks, CNN)就是一种解决方法.

 

什幺是卷积神经网络:

 

上世纪60年代,Hubel等人通过对猫视觉皮层细胞的研究,提出了感受野这个概念,到80年代,Fukushima在感受野概念的基础之上提出了神经认知机的概念,可以看作是卷积神经网络的第一个实现网络,神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。

 

 

卷积神经网络是多层感知机(MLP)的变种,由生物学家休博尔和维瑟尔在早期关于猫视觉皮层的研究发展而来,视觉皮层的细胞存在一个复杂的构造,这些细胞对视觉输入空间的子区域非常敏感,称之为 感受野 。

 

神经网络中下一层的每个神经元审视了上一层的多个像素点,越靠近输出的层越能提取更高级的语义,感受野就是下边要说的卷积核。

 

 

上图只是一个卷积神经网络的基本构成,其中卷积层和池化层可以根据实际情况任意增加。当前卷积神经网络的应用场合非常广泛,比如图像识别,自然语言处理,灾难性气候预测甚至围棋人工智能等,但是最主要的应用领域还是图像识别领域。

 

DNN和CNN等神经网络如何提取高级特征的

 

前边一些层:都是一些填充的块状物和边界等特征

 

中间一些层:学习一些纹理特征

 

更高的层:接近于分类器的层级,可以明显的看到物体的形状特征

 

最后一些层:分类层,完全是物体的不同的姿态,根据不同的物体展现出不同姿态的特征了。

 

即无论对什幺物体,神经网络学习过程特征提取过程都是:边缘→部分→整体

 

CNN和DNN对比

 

传统DNN结构图:

 

 

CNN结构图

 

 

立体点的CNN图是这样:

 

 

共同点:

 

图中每一个节点都代表一个神经元,没相邻两层之间的节点都有边相;输入输出的流程基本一致。

 

相邻每层之间的神经元连接都是 全连接 。

 

DNN是需要把输入(比如图像)转成1D的进行操作,针对的输入是一个向量串,如上边DNN图示例。

 

不同点:

 

卷积神经网络相邻两层之间只有部分的节点相连,是 局部连接 ,所以一般会将每一层的卷积层组织成一个三维矩阵。

 

CNN是直接对2D的图片直接扫描,如上边CNN立体图示例。

 

卷积神经网络的优点:

 

在图像处理方面,对于MNIST数据,每一张图片的大小是28*28*1,其中28*28为图片的大小,1表示只有一个彩色通道,并且这里的图像的颜色为黑白。假设第一层隐藏层的节点数位500个,那幺第一个全连接层的神经网络将有28 * 28 * 500+500=392500个参数。其中**+500**表示的是basic值。而当图片更大的时候,通道数增加的的时候,所需要的参数的数量会更大,会达到百万级,甚至千万级。随着参数的增多,计算速度会随之减慢,还容易导致过度拟合问题。

 

卷积采用的局部连接,参数量和输入输出节点无关,只和后边的卷积核的结构有关,参数量相对大大减少,这样不用担心过拟合可以增加更多的层,让神经网络可以提取更高级的信息。

 

CNN的基本单元卷积层

 

卷积层是卷积网络中最为重要的部分,也是最基本的单元。

 

和传统全连接层不同,卷积层中每一个节点的输入只是上一层神经网络的一小块,这个小快常用的大小有3 * 3或者5 * 5,卷积层会增加原始节点的深度。通常卷积层这部分被称为 过滤器(filetr) 或者 内核(kernel)或者卷积核 。

 

卷积核filter: 将当前的神经网络上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵,但深度不限的节点矩阵,也就是说 一个filter卷积核具有 宽w 有 高h 还有 通道深度c 这三个属性。

 

具体filter直观上是什幺样子的,请看下边的卷积过程。

 

单通道图片的卷积过程和权值共享概念:

 

 

上图左边绿色的大框就是输入数据图片image,我们可以看到有一个3*3的黄色框在图片上由左至右由上到下有规则的滑动,这个3*3的黄色框就是filter卷积核,可以看到卷积核上是有固定值的(黄色框右下角的红色值), 这3*3的固定值就是我们要训练的 参数w 了(其实少了一个bias截距项) 。

 

卷积的过程就是filter卷积核在输入数据上滑动的过程,上图右边就是卷积过程的输入值,也就是Feature Map图层。卷积过程的计算方式就是相乘相加。

 

我们还发现如最上边DNN传统结构图所示,每条连接线都是一个w参数,每个w是不一样,而CNN的参数是卷积核和截距项,卷积核局部连接的含义就是扫描,可通过上图卷积的过程发现滑动使用的是同一个filter卷积核,这就是 权值共享 了,这种设计再次大大减少了参数量。

 

彩色图片三通道的卷积过程和视角概念:

 

 

上图可以看作是对一副三通道的图像7*7*3卷积的过程。最左边是是image三个通道的的矩阵,中间是两个卷积核3*3*3 W0、W1(注意理解上图一个卷积核是三通道的),filter的通道数必须核输入数据的通道数一致,filter个数可以随意指定,不同的卷积核个数可以达到“升维”降维的效果,而生成了几个Feature Map就得看有几个filter了,也就是Feature Map的通道数等于filter卷积核的个数。

 

每个filter不同通道会产生不同的参数,也就是不同特征图对应不同的参数。

 

每个filter都相当于从不同的视觉角度审视输入图片,提取不同的特征。

 

参数的计算

 

CNN的参数只和filter卷积核三个属性以及filter个数相关,三个属性就是长宽和通道深度,再加截距项(一个filter对应一个bais截距项)整理成公式:

 

参数量 = filte长 * filter宽 *fiter通道深度 +   filter个数 + filter个数 =w*h*c*n + n

 

如上边单通道卷积图,输入神经元是5*5=25个,输出是3*3=9个,卷积核是3*3的,那幺CNN参数量=3*3*1*1+1=10,如果输入输出中间不是卷积,如果是DNN全连接的话,参数量是25*9=225个参数,这里可以看出CNN参数量是远小于DNN的了。

 

stride和padding

 

stride步长就是卷积核滑动的步长,上边我们展示的例子都是stride步长为1的,也就是每次滑动都是平移一个格子的距离,有些情况需要调整步长,步长不一样输入的Feature Map的大小长和宽就显然不一样了,下面给一个步长为2的卷积过程图:

 

 

上图底部黄色区域是输入数据,周围还有两层虚线的区域,这就是padding填充了

 

padding分为两种模式:valid 和 same

 

valid是不加padding填充,这种情况下可能会出现卷积不到边界的情况,这样我们只能舍去一部分边界像素,丢失的像素都是最右边和最下边的像素。

 

不过大家不必担心数据丢失,因为一般训练之前我们会进行数据增强,数据增强有一个操作是旋转、转置输入矩阵(图片)来扩充数据,这种操作正好弥补了valid的不足。

 

数据增强请见 详细讲解深层神经网络DNN_RayChiu757374816的博客-CSDN博客

 

Pooling池化层

 

池化层 不会改变输入数据的 通道深度 ,但是它可以 缩小矩阵的大小 。通过池化层,可以进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络参数的目的。使用池化层既可以加快计算速度也可以 防止过拟合 。池化层filter的计算不是节点的加权和,而是采用最大值或者平均值计算。使用最大值操作的池化层被称之为最大池化层(max pooling)(最大池化层是使用的最多的磁化层结构)。使用平均值操作的池化层被称之为平均池化层(mean pooling)。

 

max pooling

 

 

mean pooling

 

 

池化的作用就是降采样,为了减少计算负荷、CPU压力以及参数数量;

 

池化层和卷积层不一样没有需要训练的参数;

 

同样需要设置步长和padding,常用的就是2*2大小步长为2的max pooling池化。

 

少输入图片大小也使得神经网络可以经受一点图片平移,不受位置的影响,增加鲁棒性。

 

 

再看一下简约版的卷积神经网络

 

 

一般卷积层后边会紧跟着激活函数这样的非线性变换,否则整个网络还是线性变化,没有意义,一般顺序是卷积->ReLU->池化->卷积-> … -> 池化 ->全连接… ->输出。这其中没有说数据的归一化BN,BN在卷积和全连接后都可能会使用。

 

这里需要注意,卷积可以改变图层大小,但是主要用来升维改变(增加)通道深度提取高级特征,改变图像大小都是用pooling层来实现,卷积和全连接层有需要训练的参数,pooling层没有参数;

 

还有一点一张图片是三维的[w,h,c],一批图片是4D的[w,h,c,n],全连接每层之间的数据计算都是2D矩阵运算,但是卷积最后对接全连接的时候是4D的矩阵,不能直接运算,因此,CNN在最后卷积对接全连接的时候需要reshape(Flatten)操作把4维的矩阵拍扁成2维的,这样就可以和全连接层运算了。

 

经典的卷积网络比如VGG16、LeNet-5之类的都能很好的提取特征,无论是文本、图像、声音数据。有一个操作叫迁移学习,就是拿来这些经典网络的全连接前边部分放到我们的网络中,可以很好的提取特征,后边自己设计全连接再到最后看是什幺任务选择最终的函数转换,比如二分类就是最后接sigmoid,多分类就是softmax,回归就是什幺也不做直接y=x输出。

 

CNN及之前DNN的训练过程:

 

1.选定训练组,从样本集中分别随机地寻求N个样本作为训练组;

 

2.将各权值、阈值,置成小的接近于0的随机值,并初始化精度控制参数和学习率;

 

3.从训练组中取一个输入模式加到网络,并给出它的目标输出向量;

 

4.计算出中间层输出向量,计算出网络的实际输出向量;

 

5.将输出向量中的元素与目标向量中的元素进行比较,计算出输出误差;对于中间层的隐单元也需要计算出误差;

 

6.依次计算出各权值的调整量和阈值的调整量;

 

7.调整权值和调整阈值;

 

8.当经历M后,判断指标是否满足精度要求,如果不满足,则返回(3),继续迭代;如果满足就进入下一步;

 

9.训练结束,将权值和阈值保存在文件中。这时可以认为各个权值已经达到稳定,分类器已经形成。再一次进行训练,直接从文件导出权值和阈值进行训练,不需要进行初始化。

 

卷积神经网络注意事项

 

1)数据集的大小和分块

 

数据驱动的模型一般依赖于数据集的大小,CNN和其他经验模型一样,能够适用于任意大小的数据集,但用于训练的数据集应该足够大, 能够覆盖问题域中所有已知可能出现的问题,

 

设计CNN的时候,数据集应该包含三个子集:训练集、测试集、验证集

 

训练集:包含问题域中的所有数据,并在训练阶段用来调整网络的权重

 

测试集:在训练的过程中用于测试网络对训练集中未出现的数据的分类性能,根据网络在测试集上的性能情况,网络的结构可能需要作出调整,或者增加训练循环次数。

 

验证集:验证集中的数据统一应该包含在测试集和训练集中没有出现过的数据,用于在网络确定之后能够更好的测试和衡量网络的性能

 

Looney等人建议,数据集中65%的用于训练,25%的用于测试,10%用于验证

 

2)数据预处理

 

为了加速训练算法的收敛速度,一般都会采用一些数据预处理技术,其中包括:去除噪声、输入数据降维、删除无关数据等。

 

数据的平衡化在分类问题中异常重要,一般认为训练集中的数据应该相对于标签类别近似于平均分布,也就是每一个类别标签所对应的数据集在训练集中是基本相等的,以避免网络过于倾向于表现某些分类的特点。

 

为了平衡数据集,应该移除一些过度富余的分类中的数据,并相应补充一些相对样例稀少的分类中的数据。

 

还有一个方法就是复制一部分这些样例稀少分类中的数据,并在这些数据中加入随机噪声。

 

3)数据规则化

 

将数据规则化到统一的区间(如[0,1])中具有很重要的优点:防止数据中存在较大数值的数据造成数值较小的数据对于训练效果减弱甚至无效化,一个常用的方法是将输入和输出数据按比例调整到一个和激活函数相对应的区间。

 

4)网络权值初始化

 

CNN的初始化主要是初始化卷积层和输出层的卷积核(权值)和偏置

 

网络权值初始化就是将网络中的所有连接权重赋予一个初始值,如果初始权重向量处在误差曲面的一个相对平缓的区域的时候,网络训练的收敛速度可能会很缓慢,一般情况下网络的连接权重和阈值被初始化在一个具有0均值的相对小的区间内均匀分布。

 

5)BP算法的学习速率

 

如果学习速率选取的较大,则会在训练过程中较大幅度的调整权值w,从而加快网络的训练速度,但是这和造成网络在误差曲面上搜索过程中频繁抖动,且有可能使得训练过程不能收敛。

 

如果学习速率选取的较小,能够稳定的使得网络逼近于全局最优点,但也可能陷入一些局部最优,并且参数更新速度较慢。

 

自适应学习率设定有较好的效果。

 

6)收敛条件

 

有几个条件可以作为停止训练的判定条件,训练误差、误差梯度、交叉验证等。一般来说,训练集的误差会随着网络训练的进行而逐步降低。

 

7)训练方式

 

训练样例可以有两种基本的方式提供给网络训练使用,也可以是两者的结合:逐个样例训练(EET)、批量样例训练(BT)。

 

在EET中,先将第一个样例提供给网络,然后开始应用BP算法训练网络,直到训练误差降低到一个可以接受的范围,或者进行了指定步骤的训练次数。然后再将第二个样例提供给网络训练。

 

EET的优点是相对于BT只需要很少的存储空间,并且有更好的随机搜索能力,防止训练过程陷入局部最小区域。

 

EET的缺点是如果网络接收到的第一个样例就是劣质(有可能是噪音数据或者特征不明显)的数据,可能使得网络训练过程朝着全局误差最小化的反方向进行搜索。

 

相对的,BT方法是在所有训练样例都经过网络传播后才更新一次权值,因此每一次学习周期就包含了所有的训练样例数据。

 

BT方法的缺点也很明显,需要大量的存储空间,而且相比EET更容易陷入局部最小区域。

 

而随机训练(ST)则是相对于EET和BT一种折衷的方法,ST和EET一样也是一次只接受一个训练样例,但只进行一次BP算法并更新权值,然后接受下一个样例重复同样的步骤计算并更新权值,并且在接受训练集最后一个样例后,重新回到第一个样例进行计算。

 

ST和EET相比,保留了随机搜索的能力,同时又避免了训练样例中最开始几个样例如果出现劣质数据对训练过程的过度不良影响。

 

参考: 卷积神经网络超详细介绍_呆呆的猫的博客-CSDN博客_卷积神经网络

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注