當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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