第2章 2.4 训练网络_第1页
第2章 2.4 训练网络_第2页
第2章 2.4 训练网络_第3页
第2章 2.4 训练网络_第4页
第2章 2.4 训练网络_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

训练网络训练网络构建好网络之后,就需要用大量的数据对网络进行训练。训练网络的任务就是求解网络中的所有可学习的参数,使得网络的损失越小越好。在Keras中,要选择合适的优化器和损失函数对网络进行训练。在手写数字识别的例子中,使用SGD求解网络的参数,使用分类交叉熵损失函数。1损失函数目录优化器2训练方法3优化器优化器是编译Keras模型所需的两个参数之一。学习率衰减:加快学习的一个办法就是设置合适的学习速率,简称学习率。开始训练网络时,学习率比较大则能够学习得很快,此时应该降低学习率,使误差不会来回摆动。画出学习率的指数衰减图,其中平滑的曲线是通过设置staircase=False实现的,即指数型下降曲线;折线型曲线是通过设置staircase=True实现的,即阶梯式下降曲线。如下图所示。优化器学习算法:神经网络的学习算法就是根据大量的训练样本不断更新可训练的权重,使损失函数达到最小值的方法。神经网络的学习算法一般是基于梯度下降的,梯度下降如下图所示。

优化器1.SGD优化器tf.keras.optimizers.SGD(learning_rate=0.01,momentum=0.0,nesterov=False,name='SGD',**kwargs)SGD优化器(带动量)的语法格式如下。常用参数及其说明参数名称说明learning_rate接收浮点数,表示学习率,默认为0.01momentum接收浮点数,表示动量,可加速相关方向的梯度下降并抑制振荡,默认为0.0nesterov接收布尔值,表示是否应用涅斯捷罗夫动力,默认为Falsename接收字符串,表示优化器的名称,默认为'SGD'优化器2.Adam优化器Adam优化器(带动量)的语法格式如下。tf.keras.optimizers.Adam(learning_rate=0.001,beta_1=0.9,beta_2=0.999,epsilon=1e-07,amsgrad=False,name='Adam',**kwargs)常用参数及其说明参数名称说明learning_rate学习率,默认为0.001beta_1第一阶矩估计的指数衰减率,默认为0.9beta_2第二阶矩估计的指数衰减率,默认为0.999epsilon提升数值稳定性的一个小常数,默认为1e-07amsgrad是否应用AMSGrad变体,默认为Falsename名称,默认为'Adam'优化器2.其他优化器Keras可用的优化器的语法格式如下。optimizers.RMSprop(lr=0.001,rho=0.9,epsilon=None,decay=0.0)optimizers.Adagrad(lr=0.01,epsilon=None,decay=0.0)optimizers.Adadelta(lr=1.0,rho=0.95,epsilon=None,decay=0.0)optimizers.Adamax(lr=0.002,beta_1=0.9,beta_2=0.999,epsilon=None,decay=0.0)optimizers.Nadam(lr=0.002,beta_1=0.9,beta_2=0.999,epsilon=None,schedule_decay=0.004)Keras优化器的公共参数clipnorm和clipvalue能在所有的优化器中使用,用于控制梯度裁剪。1损失函数目录优化器2训练方法3损失函数pile(loss='sparse_categorical_crossentropy',optimizer='adam')除了优化器,损失函数也是编译Keras模型时所需的两个参数之一。所有内置的损失函数都可以通过其字符串标识符传递,设置内置损失函数的语法格式如下。损失函数通常是通过实例化损失类来创建的,也可以以函数的参数形式提供,如sparse_categorical_crossentropy,即在类的名字的单词之间加下画线并且首字母小写。使用损失类可以在实例化时传递配置参数,如下。loss_fn=keras.losses.SparseCategoricalCrossentropy(from_logits=True)损失函数1.独立使用损失函数损失函数的通用表达式为loss_fn(y_true,y_pred,sample_weight=None)。y_true是真实标签,大小为(batch_size,d0,…,dN)y_pred是预测值,大小为(batch_size,d0,…,dN)sample_weight是每个样本的加权系数默认情况下,损失函数会为每个输入样本返回一个标量损失值。但是,损失类实例具有reduction构造函数参数,该参数默认值为“sum_over_batch_size”(即平均值),允许的值为“sum_over_batch_size”“sum”“none”。“sum_over_batch_size”表示损失实例将返回批中每个样本损失的平均值“sum”表示损失实例将返回批中每个样本损失的总和“none”表示损失实例将返回每个样本损失的完整数组。损失函数2.自定义损失函数任何具有y_true和y_pred两个参数并且返回一个和输入批大小相同的数组的函数都可以作为损失函数损失函数(如tf.keras.losses.mean_squared_error)与默认损失类实例(如tf.keras.losses.MeanSquaredError)之间有重要区别。损失函数不执行归约,默认情况下,损失类实例执行归约“sum_over_batch_size”3.add_loss()方法损失函数可以由传入网络的complie函数的第2个参数进行构造,也可以在自定义层的call函数中使用add_loss()方法构造,损失函数4.预定义的损失函数

损失函数预定义的损失函数均方误差损失函数平均绝对误差损失函数平均绝对比例误差损失函数均方对数误差损失函数铰链损失函数平方铰链损失函数分类铰链损失函数KL散度损失函数泊松损失函数余弦逼近损失函数1损失函数目录优化器2训练方法3训练方法1.compile函数compile(optimizer,loss=None,metrics=None,loss_weights=None,sample_weight_mode=None,weighted_metrics=None,target_tensors=None)compile函数用于配置训练网络,语法格式如下。参数名称说明optimizer接收字符串(优化器名)或优化器实例,无默认值loss接收字符串(目标函数名)或目标函数。如果网络具有多个输出,则可以通过传递损失函数的字典或列表,在每个输出上使用不同的损失。网络将最小化的损失值是所有单个损失的总和。默认为None常用参数及其说明训练方法参数名称说明metrics接收字符串或函数,表示在训练和测试期间的网络评估标准。通常会使用metrics=['accuracy']。要为多输出网络的不同输出指定不同的评估标准,还可以传递一个字典,如metrics={'output_a':'accuracy'}。默认为Noneloss_weights接收指定标量系数(浮点数)的列表或字典,用以衡量损失函数对不同的网络输出的贡献。网络将最小化的损失值是由loss_weights系数加权的总和损失。如果是列表,那么它应该是与网络输出相对应的1:1映射。如果是字典,那么应该把输出的名称(字符串)映射到标量系数。默认为Nonesample_weight_mode接收字符串,表示权重加权的模式。如果需要执行按时间步采样权重(2D权重),请将其设置为"temporal"。取默认值None时,为采样权重(1D权重)。如果网络有多个输出,则可以通过传递模式的字典或列表,以在每个输出上使用不同的sample_weight_mode。默认为None常用参数及其说明训练方法参数名称说明weighted_metrics接收列表,表示在训练和测试期间,由sample_weight或class_weight评估和加权的度量标准列表。默认为Nonetarget_tensors默认情况下,Keras将为模型的目标数据创建一个占位符,在训练过程中将使用目标数据。相反,如果想使用自己的目标张量(反过来说,Keras在训练期间不会载入这些目标张量的外部numpy数据),可以通过target_tensors参数指定它们。它可以是单个张量(单输出模型)、张量列表,或一个映射输出名称到目标张量的字典。默认为None常用参数及其说明训练方法2.fit函数fit(x=None,y=None,batch_size=None,epochs=1,verbose=1,callbacks=None,validation_split=0.0,validation_data=None,shuffle=True,class_weight=None,sample_weight=None,initial_epoch=0,steps_per_epoch=None,validation_steps=None)fit函数以给定的轮次(数据集上的迭代次数)训练网络,并返回一个History对象。fit函数的语法格式如下。参数名称说明x接收训练数据的numpy数组(如果网络只有一个输入),或是numpy数组的列表(如果网络有多个输入)。如果网络中的输入层已被命名,也可以传递一个字典,将输入层的名称映射到numpy数组。如果从本地框架张量(例如TensorFlow数据张量)馈送数据,x可以是None。默认为None常用参数及其说明训练方法参数名称说明y接收目标数据(标签)的numpy数组(如果网络只有一个输出),或是numpy数组的列表(如果网络有多个输出)。如果网络中的输出层已被命名,也可以传递一个字典,将输出层的名称映射到numpy数组。如果从本地框架张量(例如TensorFlow数据张量)馈送数据,y可以是None。默认为Nonebatch_size接收整数,表示每次梯度更新的样本数。如果未指定,默认为Noneepochs接收整数,表示训练网络的迭代轮次。一次是在整个x和y上的一轮迭代。请注意,与initial_epoch一起使用时,epochs被理解为“最终轮次”。网络并不是训练了epochs轮,而是到第epochs轮停止训练。默认为1verbose接收0、1或2,表示日志显示模式。0为不显示,1为显示进度条,2为每轮训练显示一行。默认为1常用参数及其说明训练方法参数名称说明callbacks接收一系列的keras.callbacks.Callback实例,表示一系列可以在训练时使用的回调函数。默认为Nonevalidation_split接收0和1之间的浮点数,表示用作验证集的训练数据的比例。网络将分出一部分不会被训练的验证数据,并将在每一轮训练结束时评估这些验证数据的误差和任何其他网络指标。验证数据是混洗之前x和y数据的最后一部分样本中。默认为0.0validation_data接收元组(x_val,y_val)或元组(x_val,y_val,val_sample_weights),用于评估损失,以及在每轮训练结束时的任何网络度量指标。网络将不会在这个数据上进行训练。这个参数会覆盖validation_split。默认为None常用参数及其说明训练方法参数名称说明shuffle接收布尔值,表示是否在每轮训练之前混洗数据;也可以接收字符串(batch)。batch是处理HDF5数据限制的特殊选项,它对一个批内部的数据进行混洗。当steps_per_epoch的值非None时,这个参数无效。默认为Trueclass_weight接收字典,表示从类索引(整数)到权重(浮点)值的映射,用于加权损失函数(仅在训练期间)。这可能有助于告诉网络“更多关注”来自代表性不足的类的样本。默认为Nonesample_weight接收训练样本的可选numpy权重数组,用于对损失函数进行加权(仅在训练期间)。可以传递与输入样本长度相同的平坦(1D)numpy数组(权重和样本之间的1∶1映射);或在时序数据的情况下,可以传递尺寸为(samples,sequence_length)的2D数组,以对每个样本的每个时间步施加不同的权重。在这种情况下,应该确保在compile函数中指定sample_weight_mode="temporal"。默认为None常用参数及其说明训练方法参数名称说明initial_epoch接收整数,表示开始训练的轮次(有助于恢复之前的训练)。默认为0steps_per_epoch接收整数,表示在声明一个轮次完成并开始下一个轮次之前的总步数(批大小)。使用TensorFlow数据张量等输入张量进行训练时,取默认值None时,等于数据集中样本的数量除以批的大小;如果无法确定,则取1validation_steps接收整数,表示要验证的总步数(批大小),只有在指定了steps_per_epoch时才有用。默认为None常用参数及其说明训练方法3.evaluate函数evaluate(x=None,y=None,batch_size=None,verbose=1,sample_weight=None,steps=None,callbacks=None,max_queue_size=10,workers=1,use_multiprocessing=False,return_dict=False)evaluate函数在测试模式下返回网络的误差值和评估标准值,计算是分批进行的。函数返回测试误差标量(如果网络只有一个输出且没有评估标准)或标量列表(如果网络具有多个输出或评估标准)。属性model.metrics_names将提供标量输出的显示标签。evaluate函数的语法格式如下。训练方法参数名称说明x接收测试数据的numpy数组(如果网络只有一个输入),或是numpy数组的列表(如果网络有多个输入)。如果网络中的输入层已被命名,也可以传递一个字典,将输入层名称映射到numpy数组。如果从本地框架张量(例如TensorFlow数据张量)馈送数据,x可以是None。默认为Noney接收目标数据(标签)的numpy数组,或numpy数组的列表(如果网络具有多个输出)。如果网络中的输出层已被命名,也可以传递一个字典,将输出层的名称映射到numpy数组。如果从本地框架张量(例如TensorFlow数据张量)馈送数据,y可以是None。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论