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


Python tf.keras.optimizers.Optimizer用法及代码示例


Keras 优化器的基类。

用法

tf.keras.optimizers.Optimizer(
    name, gradient_aggregator=None, gradient_transformers=None, **kwargs
)

参数

  • name String 。用于由优化器创建的动量累加器权重的名称。
  • gradient_aggregator 用于跨设备聚合梯度的函数(使用 tf.distribute.Strategy 时)。如果 None ,默认为跨设备求和梯度。该函数应接受并返回(gradient, variable) 元组列表。
  • gradient_transformers 可选的。在将更新应用于变量之前用于转换渐变的函数列表。这些函数在 gradient_aggregator 之后应用。这些函数应该接受并返回(gradient, variable) 元组的列表。
  • **kwargs 关键字参数。允许的参数是 clipvalue , clipnorm , global_clipnorm 。如果设置了clipvalue (float),则每个权重的梯度被裁剪为不高于该值。如果设置了clipnorm (float),每个权重的梯度会被单独裁剪,使其范数不高于这个值。如果设置了global_clipnorm (float),所有权重的梯度都会被裁剪,这样它们的全局范数就不会高于这个值。

抛出

  • ValueError 在任何无效论点的情况下。

属性

  • clipnorm floatNone 。如果设置,将渐变剪辑到最大范数。
  • clipvalue floatNone 。如果设置,将渐变剪辑到最大值。
  • global_clipnorm floatNone 。如果设置,将渐变剪辑到最大范数。
  • iterations 多变的。此优化器已运行的训练步骤数。
  • weights 根据创建的订单返回此优化器的变量。

您不应直接使用此类,而应实例化其子类之一,例如 tf.keras.optimizers.SGDtf.keras.optimizers.Adam 等。

用法

# Create an optimizer with the desired parameters.
opt = tf.keras.optimizers.SGD(learning_rate=0.1)
# `loss` is a callable that takes no argument and returns the value
# to minimize.
loss = lambda:3 * var1 * var1 + 2 * var2 * var2
# In graph mode, returns op that minimizes the loss by updating the listed
# variables.
opt_op = opt.minimize(loss, var_list=[var1, var2])
opt_op.run()
# In eager mode, simply call minimize to update the list of variables.
opt.minimize(loss, var_list=[var1, var2])

在自定义训练循环中的使用

在 Keras 模型中,有时会在第一次调用模型时创建变量,而不是在构建时创建。示例包括 1) 没有预定义输入形状的序列模型,或 2) 子类模型。在这些情况下,将 var_list 作为可调用传递。

例子:

opt = tf.keras.optimizers.SGD(learning_rate=0.1)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(num_hidden, activation='relu'))
model.add(tf.keras.layers.Dense(num_classes, activation='sigmoid'))
loss_fn = lambda:tf.keras.losses.mse(model(input), output)
var_list_fn = lambda:model.trainable_weights
for input, output in data:
  opt.minimize(loss_fn, var_list_fn)

在应用渐变之前处理它们

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

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

例子:

# Create an optimizer.
opt = tf.keras.optimizers.SGD(learning_rate=0.1)

# Compute the gradients for a list of variables.
with tf.GradientTape() as tape:
  loss = <call_loss_function>
vars = <list_of_variables>
grads = tape.gradient(loss, vars)

# Process the gradients, for example cap them, etc.
# capped_grads = [MyCapper(g) for g in grads]
processed_grads = [process_gradient(g) for g in grads]

# Ask the optimizer to apply the processed gradients.
opt.apply_gradients(zip(processed_grads, var_list))

tf.distribute.Strategy 一起使用

这个优化器类是tf.distribute.Strategy 感知的,这意味着它会自动对所有副本的梯度求和。为了平均梯度,您将损失除以全局批量大小,如果您使用 tf.keras 内置训练或评估循环,则会自动完成。请参阅损失的 reduction 参数,该参数应设置为 tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE 以进行平均,或者设置为 tf.keras.losses.Reduction.SUM 以不进行平均。

要自己聚合渐变,请调用 apply_gradients,并将 experimental_aggregate_gradients 设置为 False。如果您需要处理聚合梯度,这很有用。

如果您不使用这些并且想要平均梯度,则应使用tf.math.reduce_sum 将您的per-example 损失相加,然后除以全局批量大小。请注意,当使用 tf.distribute.Strategy 时,张量形状的第一个组成部分是 replica-local 批量大小,它的偏差等于用于计算单个步骤的副本数。结果,使用 tf.math.reduce_mean 会给出错误的答案,从而导致梯度可能大很多倍。

变量约束

所有 Keras 优化器都尊重变量约束。如果将约束函数传递给任何变量,则在将梯度应用于变量后,约束将应用于变量。重要提示:如果梯度是稀疏张量,则不支持变量约束。

线程兼容性

整个优化器当前是线程兼容的,而不是线程安全的。如有必要,用户需要执行同步。

插槽

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

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

超参数

这些是传递给优化器子类构造函数(__init__ 方法)的参数,然后传递给 self._set_hyper()。它们可以是常规 Python 值(如 1.0)、张量或可调用对象。如果它们是可调用的,则将在apply_gradients() 期间调用可调用对象以获取超参数的值。

超参数可以通过用户代码覆盖:

例子:

# Create an optimizer with the desired parameters.
opt = tf.keras.optimizers.SGD(learning_rate=0.1)
# `loss` is a callable that takes no argument and returns the value
# to minimize.
loss = lambda:3 * var1 + 2 * var2
# In eager mode, simply call minimize to update the list of variables.
opt.minimize(loss, var_list=[var1, var2])
# update learning rate
opt.learning_rate = 0.05
opt.minimize(loss, var_list=[var1, var2])

可调用的学习率

优化器以两种方式接受可调用的学习率。第一种方式是通过内置或自定义的 tf.keras.optimizers.schedules.LearningRateSchedule 。每次迭代都会使用 schedule(iteration) 调用计划,这是优化器拥有的 tf.Variable

例子:

var = tf.Variable(np.random.random(size=(1,)))
learning_rate = tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate=.01, decay_steps=20, decay_rate=.1)
opt = tf.keras.optimizers.SGD(learning_rate=learning_rate)
loss = lambda:3 * var
opt.minimize(loss, var_list=[var])
<tf.Variable...

第二种方法是通过一个不接受任何参数的可调用函数。

例子:

var = tf.Variable(np.random.random(size=(1,)))
def lr_callable():
  return .1
opt = tf.keras.optimizers.SGD(learning_rate=lr_callable)
loss = lambda:3 * var
opt.minimize(loss, var_list=[var])
<tf.Variable...

创建自定义优化器

如果您打算创建自己的优化算法,只需从此类继承并覆盖以下方法:

  • _resource_apply_dense(给定梯度张量的更新变量是密集的tf.Tensor)
  • _resource_apply_sparse (给定梯度张量的更新变量是稀疏的 tf.IndexedSlices 。发生这种情况的最常见方法是,如果您通过 tf.gather 获取梯度。)
  • _create_slots(如果您的优化器算法需要额外的变量)
  • get_config(优化器的序列化,包括所有超参数)

相关用法


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