当前位置: 主页 > 行业资讯 > 陵园解答

tf.keras.optimizers.legacy.Optimizer

2024-04-08 06:11   作者:佚名

Keras 优化器的基类。

继承自:

View aliases

用于迁移的兼容别名

有关详细信息,请参阅 Migration guide

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

您不应直接使用此类,而应实例化其子类之一,例如 等。

# 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
# 在图形模式下,返回通过更新列出的操作来最小化损失的操作
# 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 作为可调用传递。

Example:

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)

调用 负责计算梯度并将其应用于变量。如果您想在应用梯度之前对其进行处理,您可以分三步使用优化器:

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

Example:

# 创建一个优化器。
opt=tf.keras.optimizers.SGD(learning_rate=0.1)

# 计算变量列表的梯度。
with tf.GradientTape() as tape:
  loss=<call_loss_function>
vars=<list_of_variables>
grads=tape.gradient(loss, vars)

# 处理梯度,例如限制梯度等。
# capped_grads=[MyCapper(g) for g in grads]
processed_grads=[process_gradient(g) for g in grads]

# 要求优化器应用处理后的梯度。
opt.apply_gradients(zip(processed_grads, var_list))

该优化器类支持 ,这意味着它会自动对所有副本的梯度求和。要平均梯度,您可以将损失除以全局批量大小,如果您使用 内置训练或评估循环,则此操作会自动完成。请参阅损失的 参数,应将其设置为 以进行平均,否则应设置为

要自行聚合梯度,请调用 ,并将 设置为 False。如果您需要处理聚合梯度,这非常有用。

如果您不使用这些并且想要平均梯度,则应该使用 将每个示例的损失相加,然后除以全局批量大小。请注意,使用 时,张量形状的第一个组成部分是副本本地批量大小,其偏差等于用于计算单个步骤的副本数量。因此,使用 会给出错误的答案,导致梯度可能大很多倍。

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

整个优化器目前是线程兼容的,而不是线程安全的。如果需要,用户需要进行同步。

许多优化器子类(例如 和 )分配和管理与要训练的变量关联的附加变量。这些被称为Slots。槽有名称,您可以向优化器询问它使用的槽的名称。获得槽名称后,您可以向优化器询问它创建的用于保存槽值的变量。

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

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

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

Example:

# 使用所需参数创建优化器。
opt=tf.keras.optimizers.SGD(learning_rate=0.1)
# `loss` 是一个不带参数并返回值的可调用函数
# 最小化。
loss=lambda: 3 * var1 + 2 * var2
# 在Eager模式下,只需调用minimum即可更新变量列表。
opt.minimize(loss, var_list=[var1, var2])
# 更新学习率
opt.learning_rate=0.05
opt.minimize(loss, var_list=[var1, var2])

优化器以两种方式接受可调用的学习率。第一种方式是通过内置或定制的 。该调度将在每次迭代时使用 (优化器拥有的 )进行调用。

Example:

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...

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

Example:

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...

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

  • (给定梯度张量的更新变量是密集的
  • (给定梯度张量的更新变量是稀疏 。发生这种情况的最常见方法是通过 获取梯度。)
  • (如果您的优化器算法需要附加变量)
  • (优化器的序列化,包括所有超参数)
Args
细绳。用于优化器创建的动量累加器权重的名称。
用于聚合跨设备梯度的函数(使用 时)。如果是 ,则默认对跨设备的梯度求和。该函数应接受并返回 元组列表。
选修的。在对变量应用更新之前用于转换渐变的函数列表。该功能在 之后应用。这些函数应接受并返回 元组列表。
关键字参数。允许的参数为 、 、 。如果设置了 (float),则每个权重的梯度被裁剪为不高于该值。如果设置了 (float),则每个权重的梯度将被单独剪裁,使其范数不高于该值。如果设置了 (浮点),则所有权重的梯度都会被剪裁,以便它们的全局范数不高于该值。
Raises
如果有任何无效参数。

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/keras/optimizers/legacy/Optimizer

同类文章推荐
Xpadder模拟键盘鼠标工具下载
婴儿奶粉大人可以喝吗
抖音电脑版官方下载_1
孔祥东 个人信息
「市场营销」专业介绍及未来职业发展建议
使用微逆变器、功率优化器提高光伏系统发电效率可行吗?

咨询登记

平台注册入口