当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.compat.v1.train.Optimizer用法及代码示例


优化器的基类。

用法

tf.compat.v1.train.Optimizer(
    use_locking, name
)

参数

  • use_locking 布尔。如果 True 应用使用锁来防止对变量的并发更新。
  • name 一个非空字符串。用于为优化器创建的累加器的名称。

抛出

  • ValueError 如果名称格式错误。

迁移到 TF2

警告:这个 API 是为 TensorFlow v1 设计的。继续阅读有关如何从该 API 迁移到本机 TensorFlow v2 等效项的详细信息。见TensorFlow v1 到 TensorFlow v2 迁移指南有关如何迁移其余代码的说明。

tf.compat.v1.train.Optimizer 可用于 Eager 模式和 tf.function ,但不推荐使用。请在 TF2 中改用tf.keras.optimizers.Optimizer 的子类。有关示例,请参阅基本训练循环或从头开始编写训练循环。

如果您的 TF1 代码包含 tf.compat.v1.train.Optimizer 符号,无论是否使用 tf.estimator.Estimator ,您都不能简单地将其替换为相应的 tf.keras.optimizers.Optimizer s。要迁移到 TF2,建议将与 Estimator 一起使用的整个训练程序迁移到基于 Keras Model.fit 或 TF2 自定义训练循环。

到原生 TF2 的结构映射

前:

sgd_op = tf.compat.v1.train.GradientDescentOptimizer(3.0)
opt_op = sgd_op.minimize(cost, global_step, [var0, var1])
opt_op.run(session=session)

后:

sgd = tf.keras.optimizers.SGD(3.0)
sgd.minimize(cost_fn, [var0, var1])

如何映射参数

TF1 参数名称 TF2 参数名称 注意
use_locking 不支持 -
name name. -

使用示例之前和之后

前:

g = tf.compat.v1.Graph()
with g.as_default():
  var0 = tf.compat.v1.Variable([1.0, 2.0])
  var1 = tf.compat.v1.Variable([3.0, 4.0])
  cost = 5 * var0 + 3 * var1
  global_step = tf.compat.v1.Variable(
      tf.compat.v1.zeros([], tf.compat.v1.int64), name='global_step')
  init_op = tf.compat.v1.initialize_all_variables()
  sgd_op = tf.compat.v1.train.GradientDescentOptimizer(3.0)
  opt_op = sgd_op.minimize(cost, global_step, [var0, var1])
session = tf.compat.v1.Session(graph=g)
session.run(init_op)
opt_op.run(session=session)
print(session.run(var0))
[-14. -13.]

后:

>>> var0 = tf.Variable([1.0, 2.0])
>>> var1 = tf.Variable([3.0, 4.0])
>>> cost_fn = lambda:5 * var0 + 3 * var1
>>> sgd = tf.keras.optimizers.SGD(3.0)
>>> sgd.minimize(cost_fn, [var0, var1])
>>> print(var0.numpy())
[-14. -13.]

此类定义 API 以添加 Ops 以训练模型。您从不直接使用此类,而是实例化其子类之一,例如 GradientDescentOptimizer , AdagradOptimizerMomentumOptimizer

用法

# Create an optimizer with the desired parameters.
opt = GradientDescentOptimizer(learning_rate=0.1)
# Add Ops to the graph to minimize a cost by updating a list of variables.
# "cost" is a Tensor, and the list of variables contains tf.Variable
# objects.
opt_op = opt.minimize(cost, var_list=<list of variables>)

在训练计划中,您只需要运行返回的操作。

# Execute opt_op to do one step of training:
opt_op.run()

在应用渐变之前处理它们。

调用minimize() 既可以计算梯度,也可以将它们应用于变量。如果您想在应用梯度之前对其进行处理,则可以分三个步骤使用优化器:

  1. 使用 compute_gradients() 计算梯度。
  2. 根据需要处理渐变。
  3. 使用 apply_gradients() 应用处理后的渐变。

例子:

# Create an optimizer.
opt = GradientDescentOptimizer(learning_rate=0.1)

# Compute the gradients for a list of variables.
grads_and_vars = opt.compute_gradients(loss, <list of variables>)

# grads_and_vars is a list of tuples (gradient, variable).  Do whatever you
# need to the 'gradient' part, for example cap them, etc.
capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]

# Ask the optimizer to apply the capped gradients.
opt.apply_gradients(capped_grads_and_vars)

门控梯度

minimize()compute_gradients() 都接受 gate_gradients 参数,该参数控制梯度应用期间的并行度。

可能的值为: GATE_NONE , GATE_OPGATE_GRAPH

GATE_NONE:并行计算和应用梯度。这提供了最大的执行并行性,但代价是结果中的一些不可重现性。例如两个梯度matmul取决于输入值:有GATE_NONE在计算另一个梯度之前,可以将其中一个梯度应用于其中一个输入,从而导致不可重现的结果。

GATE_OP:对于每个 Op,确保在使用之前计算所有梯度。这可以防止 Ops 的竞争条件为多个输入生成梯度,其中梯度取决于输入。

GATE_GRAPH:确保在使用其中任何一个变量之前计算所有变量的所有梯度。这提供了最少的并行性,但如果您想在应用任何渐变之前处理所有渐变,这可能会很有用。

插槽

一些优化器子类,例如 MomentumOptimizerAdagradOptimizer 分配和管理与要训练的变量关联的其他变量。这些被称为插槽。插槽有名称,您可以向优化器询问它使用的插槽的名称。一旦有了槽名称,您就可以向优化器询问它创建的用于保存槽值的变量。

如果您想记录调试训练算法、报告有关插槽的统计信息等,这可能很有用。

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.compat.v1.train.Optimizer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。