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
float
或None
。如果设置,将渐变剪辑到最大范数。 -
clipvalue
float
或None
。如果设置,将渐变剪辑到最大值。 -
global_clipnorm
float
或None
。如果设置,将渐变剪辑到最大范数。 -
iterations
多变的。此优化器已运行的训练步骤数。 -
weights
根据创建的订单返回此优化器的变量。
您不应直接使用此类,而应实例化其子类之一,例如 tf.keras.optimizers.SGD
、 tf.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()
既可以计算梯度,也可以将它们应用于变量。如果您想在应用梯度之前对其进行处理,则可以分三个步骤使用优化器:
- 使用
tf.GradientTape
计算梯度。 - 根据需要处理渐变。
- 使用
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 优化器都尊重变量约束。如果将约束函数传递给任何变量,则在将梯度应用于变量后,约束将应用于变量。重要提示:如果梯度是稀疏张量,则不支持变量约束。
线程兼容性
整个优化器当前是线程兼容的,而不是线程安全的。如有必要,用户需要执行同步。
插槽
许多优化器子类,例如 Adam
和 Adagrad
分配和管理与要训练的变量关联的其他变量。这些被称为插槽。插槽有名称,您可以向优化器询问它使用的插槽的名称。一旦有了槽名称,您就可以向优化器询问它创建的用于保存槽值的变量。
如果您想记录调试训练算法、报告有关插槽的统计信息等,这可能很有用。
超参数
这些是传递给优化器子类构造函数(__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
(优化器的序列化,包括所有超参数)
相关用法
- Python tf.keras.optimizers.Optimizer.set_weights用法及代码示例
- Python tf.keras.optimizers.Optimizer.apply_gradients用法及代码示例
- Python tf.keras.optimizers.Optimizer.get_weights用法及代码示例
- Python tf.keras.optimizers.schedules.serialize用法及代码示例
- Python tf.keras.optimizers.Adam用法及代码示例
- Python tf.keras.optimizers.Adamax用法及代码示例
- Python tf.keras.optimizers.SGD用法及代码示例
- Python tf.keras.optimizers.schedules.ExponentialDecay用法及代码示例
- Python tf.keras.optimizers.schedules.PiecewiseConstantDecay用法及代码示例
- Python tf.keras.optimizers.Nadam用法及代码示例
- Python tf.keras.optimizers.RMSprop用法及代码示例
- Python tf.keras.optimizers.schedules.deserialize用法及代码示例
- Python tf.keras.optimizers.schedules.CosineDecay用法及代码示例
- Python tf.keras.optimizers.schedules.CosineDecayRestarts用法及代码示例
- Python tf.keras.optimizers.Ftrl用法及代码示例
- Python tf.keras.optimizers.schedules.PolynomialDecay用法及代码示例
- Python tf.keras.optimizers.serialize用法及代码示例
- Python tf.keras.optimizers.schedules.InverseTimeDecay用法及代码示例
- Python tf.keras.applications.inception_resnet_v2.preprocess_input用法及代码示例
注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.keras.optimizers.Optimizer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。