您好,欢迎访问这里是您的网站名称官网!
新闻资讯

服务热线400-123-4567

行业资讯

首页 > 新闻资讯 > 行业资讯

TensorFlow笔记(十二)——tf.train中的Optimizer相关的函数与功能介绍

作者:佚名 发布时间:2024-04-22 14:05:05点击:

目录

1、序言

2、Tensorflow函数

2.1 训练 (Training)

█?优化 (Optimizers)

█?Slots

█?协调器和队列运行器(Coordinator and QueueRunner)


本文所讲的内容主要为以下列表中相关函数。函数training()通过梯度下降法为最小化损失函数增加了相关的优化操作,在训练过程中,先实例化一个优化函数,比如 tf.train.GradientDescentOptimizer,并基于一定的学习率进行梯度优化训练:

 

然后,可以设置 一个用于记录全局训练步骤的单值。以及使用minimize()操作,该操作不仅可以优化更新训练的模型参数,也可以为全局步骤(global step)计数。与其他tensorflow操作类似,这些训练操作都需要在tf.session会话中进行

 
操作组操作
TrainingOptimizers,Gradient Computation,Gradient Clipping,Distributed execution
TestingUnit tests,Utilities,Gradient checking

2.1 训练 (Training)

一个TFRecords 文件为一个字符串序列。这种格式并非随机获取,它比较适合大规模的数据流,而不太适合需要快速分区或其他非序列获取方式。

█?优化 (Optimizers)

tf中各种优化类提供了为损失函数计算梯度的方法,其中包含比较经典的优化算法,比如GradientDescentAdagrad

class tf.train.Optimizer

操作描述
class tf.train.Optimizer基本的优化类,该类不常常被直接调用,而较多使用其子类,
比如GradientDescentOptimizer, AdagradOptimizer
或者MomentumOptimizer
tf.train.Optimizer.__init__(use_locking, name)创建一个新的优化器,
该优化器必须被其子类(subclasses)的构造函数调用
tf.train.Optimizer.minimize(loss, global_step=None,?
var_list=None, gate_gradients=1,?
aggregation_method=None, colocate_gradients_with_ops=False,?
name=None, grad_loss=None)
添加操作节点,用于最小化loss,并更新var_list
该函数是简单的合并了compute_gradients()与apply_gradients()函数
返回为一个优化更新后的var_list,如果global_step非None,该操作还会为global_step做自增操作
tf.train.Optimizer.compute_gradients(loss,var_list=None, gate_gradients=1,
aggregation_method=None,?
colocate_gradients_with_ops=False, grad_loss=None)
对var_list中的变量计算loss的梯度
该函数为函数minimize()的第一部分,返回一个以元组(gradient, variable)组成的列表
tf.train.Optimizer.apply_gradients(grads_and_vars, global_step=None, name=None)将计算出的梯度应用到变量上,是函数minimize()的第二部分,返回一个应用指定的梯度的操作Operation,对global_step做自增操作
tf.train.Optimizer.get_name()获取名称

class tf.train.Optimizer?
用法

 

在使用它们之前处理梯度?
使用minimize()操作,该操作不仅可以计算出梯度,而且还可以将梯度作用在变量上。如果想在使用它们之前处理梯度,可以按照以下三步骤使用optimizer :

 

例如:

 

█?Slots(其它的优化器)

一些optimizer的子类,比如 MomentumOptimizer 和 AdagradOptimizer 分配和管理着额外的用于训练的变量。这些变量称之为’Slots’,Slots有相应的名称,可以向optimizer访问的slots名称。有助于在log debug一个训练算法以及报告slots状态

操作描述
tf.train.Optimizer.get_slot_names()返回一个由Optimizer所创建的slots的名称列表
tf.train.Optimizer.get_slot(var, name)返回一个name所对应的slot,name是由Optimizer为var所创建
var为用于传入 minimize() 或 apply_gradients()的变量
class tf.train.GradientDescentOptimizer使用梯度下降算法的Optimizer
tf.train.GradientDescentOptimizer.__init__(learning_rate,?
use_locking=False, name=’GradientDescent’)
构建一个新的梯度下降优化器(Optimizer)
class tf.train.AdadeltaOptimizer使用Adadelta算法的Optimizer
tf.train.AdadeltaOptimizer.__init__(learning_rate=0.001,?
rho=0.95, epsilon=1e-08,?
use_locking=False, name=’Adadelta’)
创建Adadelta优化器
class tf.train.AdagradOptimizer使用Adagrad算法的Optimizer
tf.train.AdagradOptimizer.__init__(learning_rate,?
initial_accumulator_value=0.1,?
use_locking=False, name=’Adagrad’)
创建Adagrad优化器
class tf.train.MomentumOptimizer使用Momentum算法的Optimizer
tf.train.MomentumOptimizer.__init__(learning_rate,?
momentum, use_locking=False,?
name=’Momentum’, use_nesterov=False)
创建momentum优化器
momentum:动量,一个tensor或者浮点值
class tf.train.AdamOptimizer使用Adam 算法的Optimizer
tf.train.AdamOptimizer.__init__(learning_rate=0.001,
beta1=0.9, beta2=0.999, epsilon=1e-08,
use_locking=False, name=’Adam’)
创建Adam优化器
class tf.train.FtrlOptimizer使用FTRL 算法的Optimizer
tf.train.FtrlOptimizer.__init__(learning_rate,?
learning_rate_power=-0.5,?
initial_accumulator_value=0.1,?
l1_regularization_strength=0.0,?
l2_regularization_strength=0.0,
use_locking=False, name=’Ftrl’)
创建FTRL算法优化器
class tf.train.RMSPropOptimizer使用RMSProp算法的Optimizer
tf.train.RMSPropOptimizer.__init__(learning_rate,?
decay=0.9, momentum=0.0, epsilon=1e-10,?
use_locking=False, name=’RMSProp’)
创建RMSProp算法优化器

对上述算法的说明【2】:

  • 动量(momentum)helps?SGD沿相关方向导航,并减弱无关的振荡。它只是将上一步骤的一部分方向添加到当前步骤。这可以在正确的方向上实现放大速度,并减少错误方向的振荡。该分数通常在(0,1)范围内。使用自适应动量也是有意义的。在学习开始时,一个大的动量只会阻碍你的进步,所以使用类似0.01的数值很有意义,一旦所有的高梯度消失,你可以使用更大的动量。动量也有一个问题:当我们非常接近目标时,我们在大多数情况下的动量非常高,而且它不知道它应该放慢速度。这可能导致它错过或在最低点附近振荡
  • 内斯特洛夫加速梯度(nesterov accelerated gradient, NAG)通过开始减速提前克服了这个问题。在动量中,我们首先计算梯度,然后通过先前的任何动量放大该方向的跳跃。 NAG做的是同样的事情,但是按照另一种顺序:首先我们根据存储的信息做出一个大的跳跃,然后我们计算梯度并进行一个小的修正。这个看似不相关的变化给了显著的实际加速。
  • AdaGrad或自适应梯度允许学习速率根据参数进行调整。它对不频繁的参数执行更大的更新,对频繁的参数执行更小的更新。正因为如此,它非常适合稀疏数据(NLP或图像识别)。另一个优点是它基本上不需要调整学习速度。每个参数都有其自己的学习速率,并且由于算法的特性,学习速率是单调递减的。这导致了最大的问题:在某个时间点,学习率很低,系统停止学习
  • AdaDelta解决了AdaGrad中单调降低学习率的问题。在AdaGrad中,学习率大致被计算为除以平方根之和。在每个阶段,您都会在总和中再加一个平方根,这会导致分母不断下降。在AdaDelta中,不是将所有过去的平方根相加,而是使用允许总和减少的滑动窗口。 RMSprop与AdaDelta非常相似
  • Adam或自适应动量是一种类似于AdaDelta的算法。但除了存储每个参数的学习率外,它还分别存储每个参数的动量变化A?few visualizations

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

█?协调器和队列运行器(Coordinator and QueueRunner)

查看queue中,queue相关的内容,了解tensorflow中队列的运行方式。

操作描述
class tf.train.Coordinator线程的协调器
tf.train.Coordinator.clear_stop()清除停止标记
tf.train.Coordinator.join(threads=None, stop_grace_period_secs=120)等待线程终止
threads:一个threading.Threads的列表,启动的线程,将额外加入到registered的线程中
tf.train.Coordinator.register_thread(thread)Register一个用于join的线程
tf.train.Coordinator.request_stop(ex=None)请求线程结束
tf.train.Coordinator.should_stop()检查是否被请求停止
tf.train.Coordinator.stop_on_exception()上下文管理器,当一个例外出现时请求停止
tf.train.Coordinator.wait_for_stop(timeout=None)等待Coordinator提示停止进程
class tf.train.QueueRunner持有一个队列的入列操作列表,用于线程中运行
queue:一个队列
enqueue_ops: 用于线程中运行的入列操作列表
tf.train.QueueRunner.create_threads(sess,?
coord=None, daemon=False, start=False)
创建运行入列操作的线程,返回一个线程列表
tf.train.QueueRunner.from_proto(queue_runner_def)返回由queue_runner_def创建的QueueRunner对象
tf.train.add_queue_runner(qr, collection=’queue_runners’)增加一个QueueRunner到graph的收集器(collection )中
tf.train.start_queue_runners(sess=None, coord=None, daemon=True, start=True, collection=’queue_runners’)启动所有graph收集到的队列运行器(queue runners)

class tf.train.Coordinator

 

tf.train.Coordinator.stop_on_exception()

 

参考:

【1】Tensorflow一些常用基本概念与函数(四)

【2】如何为GradientDescentOptimizer设置自适应学习率?

相关标签: in me 一个 ing

平台注册入口