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


Python tf.compat.v1.train.Optimizer用法及代碼示例


優化器的基類。

用法

tf.compat.v1.train.Optimizer(
    use_locking, name
)

參數

  • use_locking 布爾。如果 True 應用使用鎖來防止對變量的並發更新。
  • name 一個非空字符串。用於為優化器創建的累加器的名稱。

拋出

  • ValueError 如果名稱格式錯誤。

遷移到 TF2

警告:這個 API 是為 TensorFlow v1 設計的。繼續閱讀有關如何從該 API 遷移到本機 TensorFlow v2 等效項的詳細信息。見TensorFlow v1 到 TensorFlow v2 遷移指南有關如何遷移其餘代碼的說明。

tf.compat.v1.train.Optimizer 可用於 Eager 模式和 tf.function ,但不推薦使用。請在 TF2 中改用tf.keras.optimizers.Optimizer 的子類。有關示例,請參閱基本訓練循環或從頭開始編寫訓練循環。

如果您的 TF1 代碼包含 tf.compat.v1.train.Optimizer 符號,無論是否使用 tf.estimator.Estimator ,您都不能簡單地將其替換為相應的 tf.keras.optimizers.Optimizer s。要遷移到 TF2,建議將與 Estimator 一起使用的整個訓練程序遷移到基於 Keras Model.fit 或 TF2 自定義訓練循環。

到原生 TF2 的結構映射

前:

sgd_op = tf.compat.v1.train.GradientDescentOptimizer(3.0)
opt_op = sgd_op.minimize(cost, global_step, [var0, var1])
opt_op.run(session=session)

後:

sgd = tf.keras.optimizers.SGD(3.0)
sgd.minimize(cost_fn, [var0, var1])

如何映射參數

TF1 參數名稱 TF2 參數名稱 注意
use_locking 不支持 -
name name. -

使用示例之前和之後

前:

g = tf.compat.v1.Graph()
with g.as_default():
  var0 = tf.compat.v1.Variable([1.0, 2.0])
  var1 = tf.compat.v1.Variable([3.0, 4.0])
  cost = 5 * var0 + 3 * var1
  global_step = tf.compat.v1.Variable(
      tf.compat.v1.zeros([], tf.compat.v1.int64), name='global_step')
  init_op = tf.compat.v1.initialize_all_variables()
  sgd_op = tf.compat.v1.train.GradientDescentOptimizer(3.0)
  opt_op = sgd_op.minimize(cost, global_step, [var0, var1])
session = tf.compat.v1.Session(graph=g)
session.run(init_op)
opt_op.run(session=session)
print(session.run(var0))
[-14. -13.]

後:

>>> var0 = tf.Variable([1.0, 2.0])
>>> var1 = tf.Variable([3.0, 4.0])
>>> cost_fn = lambda:5 * var0 + 3 * var1
>>> sgd = tf.keras.optimizers.SGD(3.0)
>>> sgd.minimize(cost_fn, [var0, var1])
>>> print(var0.numpy())
[-14. -13.]

此類定義 API 以添加 Ops 以訓練模型。您從不直接使用此類,而是實例化其子類之一,例如 GradientDescentOptimizer , AdagradOptimizerMomentumOptimizer

用法

# Create an optimizer with the desired parameters.
opt = GradientDescentOptimizer(learning_rate=0.1)
# Add Ops to the graph to minimize a cost by updating a list of variables.
# "cost" is a Tensor, and the list of variables contains tf.Variable
# objects.
opt_op = opt.minimize(cost, var_list=<list of variables>)

在訓練計劃中,您隻需要運行返回的操作。

# Execute opt_op to do one step of training:
opt_op.run()

在應用漸變之前處理它們。

調用minimize() 既可以計算梯度,也可以將它們應用於變量。如果您想在應用梯度之前對其進行處理,則可以分三個步驟使用優化器:

  1. 使用 compute_gradients() 計算梯度。
  2. 根據需要處理漸變。
  3. 使用 apply_gradients() 應用處理後的漸變。

例子:

# Create an optimizer.
opt = GradientDescentOptimizer(learning_rate=0.1)

# Compute the gradients for a list of variables.
grads_and_vars = opt.compute_gradients(loss, <list of variables>)

# grads_and_vars is a list of tuples (gradient, variable).  Do whatever you
# need to the 'gradient' part, for example cap them, etc.
capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]

# Ask the optimizer to apply the capped gradients.
opt.apply_gradients(capped_grads_and_vars)

門控梯度

minimize()compute_gradients() 都接受 gate_gradients 參數,該參數控製梯度應用期間的並行度。

可能的值為: GATE_NONE , GATE_OPGATE_GRAPH

GATE_NONE:並行計算和應用梯度。這提供了最大的執行並行性,但代價是結果中的一些不可重現性。例如兩個梯度matmul取決於輸入值:有GATE_NONE在計算另一個梯度之前,可以將其中一個梯度應用於其中一個輸入,從而導致不可重現的結果。

GATE_OP:對於每個 Op,確保在使用之前計算所有梯度。這可以防止 Ops 的競爭條件為多個輸入生成梯度,其中梯度取決於輸入。

GATE_GRAPH:確保在使用其中任何一個變量之前計算所有變量的所有梯度。這提供了最少的並行性,但如果您想在應用任何漸變之前處理所有漸變,這可能會很有用。

插槽

一些優化器子類,例如 MomentumOptimizerAdagradOptimizer 分配和管理與要訓練的變量關聯的其他變量。這些被稱為插槽。插槽有名稱,您可以向優化器詢問它使用的插槽的名稱。一旦有了槽名稱,您就可以向優化器詢問它創建的用於保存槽值的變量。

如果您想記錄調試訓練算法、報告有關插槽的統計信息等,這可能很有用。

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.compat.v1.train.Optimizer。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。