1、4.1 4.1 二维卷积神经网络基本原理二维卷积神经网络基本原理4.2 4.2 简单卷积神经网络实例简单卷积神经网络实例4.3 4.3 过度拟合过度拟合4.4 4.4 时间优化时间优化4.5 4.5 综合二维卷积神经网络实例综合二维卷积神经网络实例第四章图像类数据处理本章将以卷积神经网络为依托,介绍相关的深度技术,并将之本章将以卷积神经网络为依托,介绍相关的深度技术,并将之应用于图像类的数据处理之中。首先介绍简单的应用于图像类的数据处理之中。首先介绍简单的2 2维卷积神经网维卷积神经网络,并在络,并在keraskeras上予以实现。然后介绍它的分类原理。最后根据上予以实现。然后介绍它的分类原理
2、。最后根据我们在实践中发现的问题,介绍神经网络的优化方法。在实践我们在实践中发现的问题,介绍神经网络的优化方法。在实践设计深度学习模型的过程中,了解每一个设计细节的根本目的。设计深度学习模型的过程中,了解每一个设计细节的根本目的。章节概述章节概述4.14.1二维卷积神经网络基本原理二维卷积神经网络基本原理明确神经网络对图像识别明确神经网络对图像识别1 1)简简单单神神经经网网络络是是寻寻找找相相邻邻数数值值之之间间的的关关系系。,图图像像中中不不仅仅仅仅具具有有数数值值信信息息(像像素素值值),它它还还包包括括位位置置关关系系。如如果果仅仅仅仅是是通通过过像像素素值值作作为为输入让一个全连接神
3、经网络去识别的话,输出的结果肯定是不同的。输入让一个全连接神经网络去识别的话,输出的结果肯定是不同的。2 2)参参数数爆爆炸炸。在在全全连连接接结结构构中中,每每一一个个节节点点的的输输入入都都是是上上一一层层所所有有节节点点的的输输出出值值到到该该节节点点的的综综合合结结果果。卷卷积积神神经经网网络络相相比比于于全全连连接接神神经经网网络络,它它不不仅仅能能够够减减少少对对计计算算资资源源的的需需求求,还还能能学学习习图图像像中中事事物物所所包包含含的空间关系和特征。的空间关系和特征。1)现现以识别一张人脸来阐述利用神经网络识别图像的思路如图以识别一张人脸来阐述利用神经网络识别图像的思路如图
4、4.1。4.1.1 4.1.1 卷积神经网络卷积神经网络CNNCNN的原理的原理人脑识别图像的过程一般是先识别轮廓,再识别不同的部件,最后人脑识别图像的过程一般是先识别轮廓,再识别不同的部件,最后识别不同部件的位置关系。这个过程即是卷积神经网络的工作过程。识别不同部件的位置关系。这个过程即是卷积神经网络的工作过程。卷积神经网络首先提取图像的细节特征,再识别由线条轮廓组成的卷积神经网络首先提取图像的细节特征,再识别由线条轮廓组成的图案,最后识别图案并输出图像的种类。图案,最后识别图案并输出图像的种类。图图4.1 4.1 人脸的识别模式人脸的识别模式2 2)滤波器)滤波器理解二维卷积的工作原理如图
5、理解二维卷积的工作原理如图4.34.3。局部感受野所学习到的权。局部感受野所学习到的权重矩阵我们称之为卷积核。卷积重矩阵我们称之为卷积核。卷积核中每一个单独的参数都描述了核中每一个单独的参数都描述了一个输入单元与输出单元间的交一个输入单元与输出单元间的交互。卷积网络具有稀疏交互也叫互。卷积网络具有稀疏交互也叫做稀疏连接或者稀疏权重的特征。做稀疏连接或者稀疏权重的特征。经过卷积操作以后获得的图像经过卷积操作以后获得的图像变小了,为了解决卷积操作后变小了,为了解决卷积操作后维数变化这一问题,提出了补维数变化这一问题,提出了补零策略,如图零策略,如图4.24.2。图图4.2 4.2 利用补零策略保持
6、维数不变利用补零策略保持维数不变图图4.3 24.3 2维卷积示意图维卷积示意图4.1.2 4.1.2 参数共享参数共享1 1)参数共享)参数共享 每个隐藏神经元具有每个隐藏神经元具有个偏置和连接到它的局部感受野的权重。对个偏置和连接到它的局部感受野的权重。对于神经网络的同一层,我们使用相同的权重与偏置。于神经网络的同一层,我们使用相同的权重与偏置。2 2)神经网络的平移不变性)神经网络的平移不变性 滤波器在一张图像上有规律地移动,只要图像上存在相应特征,无论滤波器在一张图像上有规律地移动,只要图像上存在相应特征,无论该特征出现在图像上的任何位置,滤波器都可以将其提取出来。该特征出现在图像上的
7、任何位置,滤波器都可以将其提取出来。不论画不论画面面中中的的星星星星在在什什么么地地方方,只只要要与与星星星星对对应应的的滤滤波波器器移移动动到到了了那那个个位位置置就就会被激活,反之则不被激活。会被激活,反之则不被激活。3)卷积与全连接对比)卷积与全连接对比由图由图4.44.4可以得出:卷积在存储需可以得出:卷积在存储需求和统计效率方面极大地优于稠求和统计效率方面极大地优于稠密矩阵的乘法运算。密矩阵的乘法运算。图图4.44.44.1.3 4.1.3 池化池化1 1)池池化化层层:目目的的是是简简化化从从卷卷积积层层输输出出的的信信息息,减减少少模模型型的的过过拟拟合合现现象象以及保持旋转、平
8、移、伸缩不变性等。以及保持旋转、平移、伸缩不变性等。2 2)一个典型的卷积网络如图)一个典型的卷积网络如图4.54.5 图图4.54.5一次完整卷积层操作一次完整卷积层操作3 3)最大池化与平均池化最大池化与平均池化在提取特征误差来源的区别在提取特征误差来源的区别 邻域大小受限造成的估计值方差增大;邻域大小受限造成的估计值方差增大;卷积层参数误差造成估计均值的偏移。卷积层参数误差造成估计均值的偏移。4.1.4 4.1.4 分类原理分类原理1 1)个完整的卷积神经网络个完整的卷积神经网络如图如图4.64.62 2)二分类)二分类SoftMaxSoftMax函数函数SoftMaxSoftMax是是
9、一一种种在在参参与与其其中中的的单单元元之之间间形形成成竞竞争争的的方方式式:Softmax Softmax 输输出出总总和和等等于于1 1,所所以以一一个个单单元元的的值值增增加加必必然然对对应应着着其其他他单单元元值值的的减减少少。这这与与被被认认为为存存在在于于皮皮质质中中相相邻邻神神经经元元间间的的侧侧抑抑制制类类似似。最最终终是是希希望望其其中中一一个正确的输出接近个正确的输出接近1 1,其他的接近,其他的接近0 0。图图4.6 4.6 卷积神经网络卷积神经网络 4.2简单卷积神经网络实例简单卷积神经网络实例1 1)训练数据集)训练数据集MNISTMNIST过程与构建过程与构建Ten
10、sorboardTensorboard图像图像的数据流程图如图的数据流程图如图4.74.72 2)TensorFlowTensorFlow代码与代码与KerasKeras代码的区别代码的区别 TensorFlowTensorFlow代代码码的的结结构构性性不不强强,较较为为冗冗余余复复杂杂,但但灵灵活活性性强强,可可以以自自行行编编写写不不同同的的层层。KerasKeras代代码码简简单单清清晰晰,条条理理性性好好,但但由由于于强强大大的的封封装装而而导导致致灵灵活活性性有有所所下下降降。因因此此对对于于深深度度学学习习方方面面的的新新手手而而言言,利利用用KerasKeras能能够够快速进入
11、项目,是一个不错的选择。快速进入项目,是一个不错的选择。3 3)基于基于TensorFlowTensorFlow的的KerasKeras来实现对手写体数字的识别来实现对手写体数字的识别的步骤:的步骤:1 1 导入所需包;导入所需包;2 2 内嵌显示图像;内嵌显示图像;3 3 参数定义;参数定义;4 4 定义数据集与验证集位置;定义数据集与验证集位置;5 5 图像归一化;图像归一化;6 6 图像生成(训练集);图像生成(训练集);7 7 图像生成(验证集);图像生成(验证集);8 8 构建模型;构建模型;9 9 堆堆叠叠二二维维卷卷积积层层,使使用用6464个个卷卷积积核核,跨跨度度为为1111
12、,使使用用补补零零方方法法,输输入维度为入维度为28282828单通道灰度图像,激活函数为单通道灰度图像,激活函数为ReLuReLu,卷积核规模为,卷积核规模为2222;10 10 堆叠最大池化层,池化层大小为堆叠最大池化层,池化层大小为2222;11 11 堆堆叠叠第第二二次次二二维维卷卷积积层层,使使用用128128个个卷卷积积核核,跨跨度度为为11,使使用用补补零零方法,输入维度为方法,输入维度为2828 2828 单通道灰度图像,激活函数为单通道灰度图像,激活函数为ReLuReLu;12 12 全连接层,使用全连接层,使用softmaxsoftmax分类;分类;13 13 模型编译,制
13、定交叉熵代价函数,优化器为模型编译,制定交叉熵代价函数,优化器为rmsproprmsprop,评估方法为,评估方法为识别准确度;识别准确度;14 14 模型训练,制定输入、输出,批量规模。调用模型训练,制定输入、输出,批量规模。调用TensorboardTensorboard,并把,并把训练历史写入制定的目录训练历史写入制定的目录log_dirlog_dir;15 15 记录训练历史,打印历史关键字,绘制训练过程图像,指定图像名记录训练历史,打印历史关键字,绘制训练过程图像,指定图像名称,横纵坐标名称;称,横纵坐标名称;16 16 最后显示图像。最后显示图像。4 4)单独利用)单独利用Tens
14、orFlowTensorFlow实现卷积神经网络的步骤:实现卷积神经网络的步骤:1 1导入所需包;导入所需包;2 2始化权重函数;始化权重函数;3 3初始化偏置项;初始化偏置项;4 4 定义卷积函数;定义卷积函数;5 5定义一个定义一个2222的最大池化层;的最大池化层;6 6定义输入变量;定义输入变量;7 7定义输出变量;定义输出变量;8 8初始化权重初始化权重,第一层卷积,数字第一层卷积,数字3232代表输出的代表输出的3232个通道;个通道;9 9初始化偏置项;初始化偏置项;10 10 将将输输入入的的x x转转换换成成一一个个4 4维维向向量量。第第2 2、3 3维维对对应应图图像像的
15、的宽宽和和高高度度,最最后一维代表图像的颜色通道数;后一维代表图像的颜色通道数;11 11 卷积并激活第一层;卷积并激活第一层;12 12 池化第一层;池化第一层;13 13 初始权重;初始权重;14 14 初始化偏置项;初始化偏置项;15 15 将第一层卷积池化后的结果作为第二层卷积的输入;将第一层卷积池化后的结果作为第二层卷积的输入;16 16 池化第二层;池化第二层;17 17 设置全连接层的权重;设置全连接层的权重;18 18 设置全连接层的偏置;设置全连接层的偏置;19 19 将将第第二二层层卷卷积积池池化化后后的的结结果果,转转换换成成一一个个77647764的的数数组组;20 2
16、0 通通过过全全连接之后并激活;连接之后并激活;2121防止过拟合;防止过拟合;22 22 日志输出,每迭代日志输出,每迭代100100次输出一次日志;次输出一次日志;23 23 定义交叉熵为损失函数;定义交叉熵为损失函数;24 24最小化交叉熵;最小化交叉熵;25 25计算准确率;计算准确率;26 26下载下载ministminist的手写数字的数据集;的手写数字的数据集;4.3 过度拟合过度拟合4.3.1 4.3.1 容量、过拟合与欠拟合的基本概念容量、过拟合与欠拟合的基本概念1 1)增强机器学习算法效果的方法主要有增强机器学习算法效果的方法主要有:降低训练误差;降低训练误差;缩小训练误差
17、和测试误差的差距。缩小训练误差和测试误差的差距。这这两两个个因因素素对对应应机机器器学学习习的的两两个个主主要要挑挑战战:欠欠拟拟合合(underfittingunderfitting)和和过过拟拟合合(overfittingoverfitting)。欠欠拟拟合合是是指指模模型型不不能能在在训训练练集集上上获获得得足足够够低低的的误误差差。而而过过拟拟合合是是指指训训练练误误差差和和测测试试误误差差之之间间的的差差距距过过大大。通通过过调调整整模模型型的的容容量量(CapacityCapacity),可可以以控控制制模模型型是是否否偏偏向向于于过过拟拟合合或或者者欠欠拟拟合合。容容量量低低的的
18、模模型型可可能能很很难难拟拟合合训训练练集集。容容量量高高的的模模型型可可能能会会过过拟拟合合,也也就就是是过过度度学学习了训练集的特征。习了训练集的特征。2 2)比较线性、二次和六次函数拟合数据点集的效果如图)比较线性、二次和六次函数拟合数据点集的效果如图4.84.8。(a a)利用线性函数拟合数据将会导致欠拟合,)利用线性函数拟合数据将会导致欠拟合,无法捕捉数据中的非线性信息。无法捕捉数据中的非线性信息。(b b)使二次函数拟合数据,泛化得比较好,不会导致明显的欠拟合或过拟合。)使二次函数拟合数据,泛化得比较好,不会导致明显的欠拟合或过拟合。(c c)显示了)显示了6 6阶多项式拟合原始数
19、据集的情况,有可能导致过拟合。阶多项式拟合原始数据集的情况,有可能导致过拟合。由由此此可可得得出出结结论论:高高阶阶多多项项式式如如果果复复杂杂到到它它的的训训练练参参数数比比训训练练样样本本还还多多,虽虽然然能能够够获获得得很很多多穿穿过过训训练练样样本本点点的的描描述述函函数数,但但难难以以在在这这些些不不同同的的函函数数解解中中选选出出一一个个具有良好泛化性的结果。具有良好泛化性的结果。图图4.84.84.3.3 L24.3.3 L2正则化正则化4.3.4 L14.3.4 L1正则化正则化1)L11)L1正则化如图正则化如图4.10:L24.10:L2正则化是权重衰减最常见的形式,我们还
20、可以使正则化是权重衰减最常见的形式,我们还可以使用其他的方法来限制模型参数的规模用其他的方法来限制模型参数的规模,L1L1正则化,它具有使特征表示更为正则化,它具有使特征表示更为稀疏的性质。稀疏的性质。2)2)分析分析L1L1正则化的提出原理以及正则化的提出原理以及L1L1正则化的稀疏性。正则化的稀疏性。图图4.10 L14.10 L1规范化原理规范化原理通过对比通过对比L1L1、L2L2正则化的稀疏性如图正则化的稀疏性如图4.114.11我们得到下面结论:我们得到下面结论:L1L1正则化,正则化,其约束项所对应的顶点最优解的坐标为(其约束项所对应的顶点最优解的坐标为(0 0,w w)。约束函
21、数具有许多突)。约束函数具有许多突出的角,目标函数与这些角接触的概率会远大于约束函数的其它部位。出的角,目标函数与这些角接触的概率会远大于约束函数的其它部位。在这些角上,许多的权值为在这些角上,许多的权值为0 0,因此,因此L1L1正则化相对于正则化相对于L2L2正则化更具有稀正则化更具有稀疏性。疏性。图图4.11 L14.11 L1、L2L2规范化稀疏性对比规范化稀疏性对比4.3.5 Dropout4.3.5 Dropout1)1)弃权(弃权(DropoutDropout)技术是一种计算方便,能够提升模型泛化能力的深度学)技术是一种计算方便,能够提升模型泛化能力的深度学习模型的改进方法如图习
22、模型的改进方法如图4.124.12。图图4.12 Dropout4.12 Dropout原理,左图为原始网络,右图为经过原理,左图为原始网络,右图为经过dropoutdropout处理后的处理后的众多网络中的一个示例众多网络中的一个示例 只只需需要要将将随随机机选选出出的的那那些些单单元元的的输输出出乘乘以以0 0就就可可以以有有效效地地删删除除这这个个单单元元,通通常常以以将将神神经经元元乘乘以以掩掩码码的的形形式式予予以以实实现现。在在训训练练过过程程中中使使用用DropoutDropout时时,通通常常使使用用基基于于小小批批量量数数据据的的学学习习算算法法。DropoutDropout
23、前前向向传传播播示示4.134.13意意图图。其其中中,深深颜颜色色的为被采样的神经元。本质上讲就是从原始网络中随机挑选子网络。的为被采样的神经元。本质上讲就是从原始网络中随机挑选子网络。4.13 Dropout4.13 Dropout前向传播前向传播Dropout训练的目标是最小化代价函数的期望训练的目标是最小化代价函数的期望,即,即在在DropoutDropout中所有的子模型是参数共享的中所有的子模型是参数共享的进一步从数学的角度来分析进一步从数学的角度来分析DropoutDropout虽然到目前为止还没有成熟的理论让我们确定深度神经网络是否允许以某种可行虽然到目前为止还没有成熟的理论让
24、我们确定深度神经网络是否允许以某种可行的方式来简化式的方式来简化式如下,如下,但是在大量的工程实践中我们发现一般但是在大量的工程实践中我们发现一般10102020个掩码就可个掩码就可以获得不错的表现。以获得不错的表现。另一个近似全部子网络的预测方法是利用所有子网络预测分布的几何平均来另一个近似全部子网络的预测方法是利用所有子网络预测分布的几何平均来代替算术平均代替算术平均。通过几何平均定义的非标准化概率分布。通过几何平均定义的非标准化概率分布。DropoutDropout的另一个重要观点是,可以通过评估模型中的的另一个重要观点是,可以通过评估模型中的来近似来近似这种方法被称为权重比例推断规则这
25、种方法被称为权重比例推断规则(Weight Scaling Inference Rule)Dropout的优点:的优点:1 1 计算方便计算方便2 2 不会特别限制适用的模型或训练过程不会特别限制适用的模型或训练过程4.3.6 4.3.6 提前终止提前终止 当模型具有很强的学习能力时极有可能会过度学习训练集样本。在这个时当模型具有很强的学习能力时极有可能会过度学习训练集样本。在这个时候如图候如图4.144.14所示,训练误差(图中下方的曲线)确实会随着时间的推移逐渐降低所示,训练误差(图中下方的曲线)确实会随着时间的推移逐渐降低但验证集(图中上方的曲线)的误差有可能会再次上升,并且这种现象几乎
26、一定但验证集(图中上方的曲线)的误差有可能会再次上升,并且这种现象几乎一定会出现。会出现。训练集 验证集图图4.14 4.14 过拟合造成的损失升高过拟合造成的损失升高提前终止算法的基本流程提前终止算法的基本流程如图如图4.15所示所示图图4.15 4.15 提前终止算法基本流程提前终止算法基本流程 提前终止算法理解为是一个非常高效的超参数选择算法提前终止算法理解为是一个非常高效的超参数选择算法,显著的代价是显著的代价是训练期间要定期评估验证集。训练期间要定期评估验证集。提前终止可单独使用或与其他的正则化策略结合使用提前终止可单独使用或与其他的正则化策略结合使用,需要评估模型需要评估模型在验证
27、集上的表现在验证集上的表现。为了更好地利用这些额外的评估数据,我们可以在完成提前为了更好地利用这些额外的评估数据,我们可以在完成提前终止的首次训练之后,进行额外的训练。终止的首次训练之后,进行额外的训练。可用于额外训练过程可用于额外训练过程的两个基本策略的两个基本策略。1 1 将模型作为一个全新的空白模型,重新初始化模型全部参数,然后将模型作为一个全新的空白模型,重新初始化模型全部参数,然后使用所有数据再次训练使用所有数据再次训练。2 2 先由部分数据训练模型,然后再使用全部的数据继续训练先由部分数据训练模型,然后再使用全部的数据继续训练。提前终止正则化模型的真正机制提前终止正则化模型的真正机
28、制将模型的参数空间限制在初始参数将模型的参数空间限制在初始参数的一个邻域之内的一个邻域之内。提前终止算法的效果与提前终止算法的效果与L2L2正则化的效果相似正则化的效果相似如图如图4.164.16所示,所示,这两种算法最大的这两种算法最大的区别在于提前终止算法从初始化参数的位置开始梯度下降,然后随着梯度下降区别在于提前终止算法从初始化参数的位置开始梯度下降,然后随着梯度下降方向开始更新参数方向开始更新参数。图图4.16 4.16 提前终止算法与提前终止算法与L2L2正则化的区别。在提前终止算法的图中虚线代表梯度正则化的区别。在提前终止算法的图中虚线代表梯度下降的轨迹,在下降的轨迹,在L2L2正
29、则化的图中圆圈代表着惩罚项范围。正则化的图中圆圈代表着惩罚项范围。提前终止需要监控验证集误差,以便在空间中适当的点处终止轨迹变化。提前终止需要监控验证集误差,以便在空间中适当的点处终止轨迹变化。我们可以在我们可以在KerasKeras中实现提前终止。中实现提前终止。#调用调用 EarlyStopping EarlyStopping包包from keras.callbacks import EarlyStoppingfrom keras.callbacks import EarlyStopping#监控验证集损失,耐心设置为监控验证集损失,耐心设置为2 2early_stopping=Early
30、Stopping(monitor=val_loss,patience=2)early_stopping=EarlyStopping(monitor=val_loss,patience=2)model.fit(X,y,validation_split=0.2,callbacks=early_stopping)model.fit(X,y,validation_split=0.2,callbacks=early_stopping)4.4 4.4 时间优化时间优化 在实际的工程应用中我们不仅仅追求模型的识别能力,还追求在相同精度情在实际的工程应用中我们不仅仅追求模型的识别能力,还追求在相同精度情况下能
31、够有着更低的时间成本以及计算成本。本节我们主要学习如何在优化模型况下能够有着更低的时间成本以及计算成本。本节我们主要学习如何在优化模型性能的同时降低模型的时间成本,节约计算资源。性能的同时降低模型的时间成本,节约计算资源。4.4.1 4.4.1 交叉熵代价函数交叉熵代价函数我们希望构造的深度学习模型当遇到较大的错误时可以很快地改正错误,我们希望构造的深度学习模型当遇到较大的错误时可以很快地改正错误,快速的更新参数。快速的更新参数。但是当我们构造了模型以后有时候可以发现这样的现象,在开但是当我们构造了模型以后有时候可以发现这样的现象,在开始的时候模型性能提升得很慢,而到了后期模型性能改善的速度突
32、然加快了如图始的时候模型性能提升得很慢,而到了后期模型性能改善的速度突然加快了如图4.174.17所示。所示。图图4.17 4.17 错误较大时的学习缓慢现象错误较大时的学习缓慢现象参参数数的的更更新新速速度度是是与与其其激激活活函函数数的的梯梯度度有有关关。如如图图4.184.18所所示示,以以sigmoidsigmoid函函数数举举例例,当当 值值较较大大时时,sigmoidsigmoid函函数数的的输输出出较较为为平平缓缓,梯梯度度较较小小,由由于于参参数数更更新的速度受其影响新的速度受其影响,因此参数迭代速度较慢。这就是学习缓慢的原因所在。因此参数迭代速度较慢。这就是学习缓慢的原因所在
33、。图图4.18 sigmoid4.18 sigmoid函数函数交叉熵代价函数交叉熵代价函数图图4.19 4.19 交叉熵代价函数缓解了学习缓慢的问题,在误差较大时学习速度也较快交叉熵代价函数缓解了学习缓慢的问题,在误差较大时学习速度也较快4.4.2 4.4.2 批标准化批标准化epsilonepsilon为大于为大于0 0的小浮点数,用于防止除的小浮点数,用于防止除0 0错误;错误;modemode为整数,指定规范化的模为整数,指定规范化的模式,取式,取0 0或或1 1;momentummomentum是指在按特征规范化时,计算数据的指数平均数和标准是指在按特征规范化时,计算数据的指数平均数和
34、标准差时的动量;差时的动量;weightsweights为初始化权重,为包含为初始化权重,为包含2 2个个numpy arraynumpy array的的listlist,其,其shapeshape为为(input_shape,),(input_shape)(input_shape,),(input_shape);beta_initbeta_init为为betabeta的初始化方法;的初始化方法;gamma_initgamma_init为为gammagamma的初始化方法。还有的初始化方法。还有gamma_regularizergamma_regularizer为为WeightRegulari
35、zer(WeightRegularizer(如如L1L1或或L2L2正则化正则化)的实例,作用在的实例,作用在gammagamma向量上;向量上;beta_regularizerbeta_regularizer为为WeightRegularizerWeightRegularizer的实例,作用在的实例,作用在betabeta向量上。向量上。利用利用KerasKeras直接实现批标准化的程序:直接实现批标准化的程序:keras.layers.normalization.BatchNormalization(epsilon=1e-06,mode=0,axis=-1,momentum=0.9,wei
36、ghts=None,beta_init=zero,gamma_init=one)4.4.3 4.4.3 随机梯度下降随机梯度下降我们可以通过计算随机选取的小批量数据的梯度来估算整体的梯度,小批量数我们可以通过计算随机选取的小批量数据的梯度来估算整体的梯度,小批量数据的梯度是整体数据梯度的无偏估计。用小批量数据的梯度估算整体的梯度,据的梯度是整体数据梯度的无偏估计。用小批量数据的梯度估算整体的梯度,降低了对计算资源的需求,加速了学习的进程。当我们随机抽取完全部的训练降低了对计算资源的需求,加速了学习的进程。当我们随机抽取完全部的训练输入后,就完成了一次训练迭代。这样,我们就得到了随机梯度下降算法
37、的参输入后,就完成了一次训练迭代。这样,我们就得到了随机梯度下降算法的参数更新方法。数更新方法。图图4.204.20给出了给出了SGDSGD的算法流程。的算法流程。图图4.204.20给出了给出了SGDSGD的算法流程的算法流程SGDSGD算法中的另一个关键参数是学习率算法中的另一个关键参数是学习率,使用固定值的学习率是可以的,但是使用固定值的学习率是可以的,但是在实践中,有必要随着时间的推移逐渐降低学习率在实践中,有必要随着时间的推移逐渐降低学习率。当我们使用批量梯度下降到极小点时,整个代价函数的真实梯度会变得很小直当我们使用批量梯度下降到极小点时,整个代价函数的真实梯度会变得很小直至为至为
38、0 0,因此批量梯度下降可以使用固定的学习率。保证,因此批量梯度下降可以使用固定的学习率。保证SGDSGD收敛的一个充分条收敛的一个充分条件是:件是:且满足且满足:实际应用过程中,一般学习率会线性衰减到第实际应用过程中,一般学习率会线性衰减到第次迭代次迭代:4.4.4 4.4.4 动量动量梯度下降算法仅仅是令代价函数沿着梯度下降的方向不断减小,会存在梯梯度下降算法仅仅是令代价函数沿着梯度下降的方向不断减小,会存在梯度下降时沿着梯度减少的方向不停振荡的情况,也就是说代价函数的值虽然总体度下降时沿着梯度减少的方向不停振荡的情况,也就是说代价函数的值虽然总体趋势是减小的,但是它会反复振荡直至最小趋势
39、是减小的,但是它会反复振荡直至最小如图如图4.21所示所示。图图4.21 4.21 梯度下降算法的振荡现象梯度下降算法的振荡现象图图4.22 4.22 动量梯度下降算法减缓了振荡现象动量梯度下降算法减缓了振荡现象 箭箭头头的的牵牵引引方方向向总总是是指指向向梯梯度度下下降降的的方方向向,当当运运动动方方向向与与梯梯度度下下降降方方向向相同时,牵引速度使代价函数下降的速度加快,反之则阻碍运动相同时,牵引速度使代价函数下降的速度加快,反之则阻碍运动如图如图4.224.22。系数系数 和和 越大其梯度衰减的越少,这也就意味着之前梯度对现在方向的影越大其梯度衰减的越少,这也就意味着之前梯度对现在方向的
40、影响也越大。带动量的响也越大。带动量的SGDSGD算法过程算法过程如图如图4.234.23:图图4.23 4.23 动量梯度下降算法流程动量梯度下降算法流程 在普通的在普通的SGDSGD算法中,梯度下降的步长仅仅是梯度的范数乘以学习率。算法中,梯度下降的步长仅仅是梯度的范数乘以学习率。动量算法就是求解微分方程。求解微分方程的一个简单数值方法是欧拉方法。动量算法就是求解微分方程。求解微分方程的一个简单数值方法是欧拉方法。微分方程表示了相应物理量的变化趋势微分方程表示了相应物理量的变化趋势。我们可以在我们可以在KerasKeras中直接实现含动量的梯度下降:中直接实现含动量的梯度下降:sgd=SG
41、D(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True)pile(loss=mean_squared_error,optimizer=sgd)4.4.5 Nesterov4.4.5 Nesterov动量动量NesterovNesterov动量算法是标准动量算法的一个变种。在凸批量梯度的情况下动量算法是标准动量算法的一个变种。在凸批量梯度的情况下NesterovNesterov动量改进了额外误差收敛率,但是在随机梯度的情况下却没有改动量改进了额外误差收敛率,但是在随机梯度的情况下却没有改进。关于凸优化相关知识已经超出了本书的范围,这里我们不作过多的讲进。关
42、于凸优化相关知识已经超出了本书的范围,这里我们不作过多的讲解。具体的解。具体的NesterovNesterov动量算法流程如图动量算法流程如图4.244.24所示。所示。图图4.40 Nesterov4.40 Nesterov动量梯度下降算法流程动量梯度下降算法流程 我我们们可可以以在在KerasKeras中中直直接接实实现现含含NesterovNesterov动动量量梯梯度度下下降降算算法法,它它和和我我们们上上一一节所讲的动量梯度下降算法在一起:节所讲的动量梯度下降算法在一起:sgd=SGD(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True)pil
43、e(loss=mean_squared_error,optimizer=sgd)当当nesterovnesterov为为TrueTrue时,即开启了时,即开启了NesterovNesterov动量。动量。4.5 4.5 综合二维卷积神经网络实例综合二维卷积神经网络实例 我们将实现一个综合了本章所介绍的多项技术的深度学习模型,并将其应用我们将实现一个综合了本章所介绍的多项技术的深度学习模型,并将其应用于一个实际的工程当中。我们利用二维卷积神经网络去识别相对于手写体数字来于一个实际的工程当中。我们利用二维卷积神经网络去识别相对于手写体数字来讲更加复杂的图像讲更加复杂的图像。首先,我们先将数据分为训
44、练集与验证集,分为两个文件首先,我们先将数据分为训练集与验证集,分为两个文件夹夹traintrain和和testtest如图如图4.254.25。图图4.25 4.25 将数据分为训练集与验证集将数据分为训练集与验证集 每每个个文文件件夹夹中中拥拥有有三三个个子子文文件件夹夹,分分别别按按类类存存放放汽汽车车(BUSBUS)、花花(HUAHUA)和和恐龙(恐龙(KONGLONGKONGLONG)的图像)的图像如图如图4.264.26。图图4.26 4.26 分别按类存放汽车、恐龙和花的图像分别按类存放汽车、恐龙和花的图像这里,我们利用这里,我们利用KerasKeras来构建深度学习模型。来构建
45、深度学习模型。#导入所需要的所有包导入所需要的所有包import numpy as npimport numpy as npimport pandas as pdimport pandas as pd%matplotlib inline#%matplotlib inline#内嵌显示图像内嵌显示图像import matplotlibimport matplotlibimport matplotlib.pyplot as pltimport matplotlib.pyplot as pltfrom keras import optimizersfrom keras import optimize
46、rsfrom keras import regularizersfrom keras import regularizersfrom keras.models import Sequentialfrom keras.models import Sequentialfrom keras.layers import Dense,Dropoutfrom keras.layers import Dense,Dropoutfrom keras.wrappers.scikit_learn import KerasClassifierfrom keras.wrappers.scikit_learn impo
47、rt KerasClassifierfrom keras.utils import np_utilsfrom keras.utils import np_utilsfrom sklearn.model_selection import train_test_split,KFold,from sklearn.model_selection import train_test_split,KFold,cross_val_scorecross_val_scorefrom sklearn.preprocessing import LabelEncoderfrom sklearn.preprocessi
48、ng import LabelEncoderfrom keras.layers.core import Dense,Dropout,Activationfrom keras.layers.core import Dense,Dropout,Activationfrom keras.layers import Conv2D,MaxPooling2D,GlobalAveragePooling2D,from keras.layers import Conv2D,MaxPooling2D,GlobalAveragePooling2D,FlattenFlattenfrom keras.preproces
49、sing.image import ImageDataGeneratorfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.callbacks import TensorBoardfrom keras.callbacks import TensorBoardfrom keras.callbacks import EarlyStoppingfrom keras.callbacks import EarlyStopping#预设参数预设参数img_height=28img_height=28img_width=28i
50、mg_width=28#指定训练集以及验证集的位置指定训练集以及验证集的位置train_data_dir=D:DLsampletraintrain_data_dir=D:DLsampletrainvalidation_data_dir=D:DLsampletestvalidation_data_dir=D:DLsampletest#图像归一化图像归一化train_datagen=ImageDataGenerator(rescale=1./255)train_datagen=ImageDataGenerator(rescale=1./255)test_datagen=ImageDataGener