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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。