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


Python tf.train.ExponentialMovingAverage用法及代碼示例


通過采用 index 衰減來保持變量的移動平均值。

用法

tf.train.ExponentialMovingAverage(
    decay, num_updates=None, zero_debias=False,
    name='ExponentialMovingAverage'
)

參數

  • decay 浮點數。使用的衰變。
  • num_updates 應用於變量的更新次數的可選計數。
  • zero_debias 如果 True ,零偏差 moving-averages 用張量初始化。 (注意:當啟用即刻執行時,移動平均線可能不會使用非變量張量初始化)。
  • name String 。用於在 apply() 中添加的操作名稱的可選前綴名稱。

屬性

  • name 此 ExponentialMovingAverage 對象的名稱。

在訓練模型時,保持訓練參數的移動平均值通常是有益的。使用平均參數的評估有時會產生比最終訓練值更好的結果。

apply() 方法在第一次調用時添加訓練變量的影子副本,並在每次額外調用時在其影子副本中維護訓練變量的移動平均值。它通常應該在創建模型權重之後立即調用,然後在每個訓練步驟之後調用。

average() 方法允許訪問影子變量。通過 var.assign(ema.average(var)) 將移動平均值加載到模型中,它允許您使用移動平均值代替最後訓練的值進行評估。此外,雖然 ExponentialMovingAverage 對象不能通過檢查點直接跟蹤,但 average() 返回模型權重的移動平均變量,然後您可以對其進行檢查點。 (在此文檔字符串的底部附近有一個示例)。因此,average() 在構建評估模型或從檢查點文件恢複模型時很有用。

使用 index 衰減計算移動平均值。您在創建ExponentialMovingAverage 對象時指定衰減值。陰影變量使用與訓練變量相同的初始值進行初始化。當您運行apply 來維護移動平均線時,每個影子變量都會使用以下公式進行更新:

shadow_variable -= (1 - decay) * (shadow_variable - variable)

這在數學上等同於下麵的經典公式,但使用 assign_sub op(公式中的 "-=")允許對變量進行並發無鎖更新:

shadow_variable = decay * shadow_variable + (1 - decay) * variable

decay 的合理值接近 1.0,通常在 multiple-nines 範圍內:0.999、0.9999 等。

創建訓練模型時的示例用法:

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...

# Create an ExponentialMovingAverage object
ema = tf.train.ExponentialMovingAverage(decay=0.9999)

# The first `apply` creates the shadow variables that hold the moving averages
ema.apply([var0, var1])

# grab the moving averages for checkpointing purposes or to be able to
# load the moving averages into the model weights
averages = [ema.average(var0), ema.average(var1)]

...
def train_step(...):
...
  # Apply the optimizer.
  opt.minimize(my_loss, [var0, var1])

  # Update the moving averages
  # of var0 and var1 with additional calls to `apply`
  ema.apply([var0, var1])

...train the model by running train_step multiple times...

有幾種方法可以使用移動平均線進行評估:

  1. 在評估您的模型之前,使用Variable.assign(...) 將陰影變量的值分配給您的模型變量。您可以使用average() 方法來獲取給定變量的影子變量。要在使用這種方法後繼續訓練,請確保在繼續訓練之前記錄未平均的權重並恢複它們。您可以查看 tensorflow-addons' MovingAverage 優化器的 swap_weights 方法,了解如何在分布式設置中有效交換變量的一個示例:https://github.com/tensorflow/addons/blob/v0.13.0/tensorflow_addons/optimizers /moving_average.py#L151
  2. 確保在 tf.train.Checkpoint 中檢查出移動平均變量。在評估時,創建您的影子變量並使用tf.train.Checkpoint 將移動平均線恢複到影子變量中。然後,通過 var.assign(moving_avg) 將移動平均值加載到實際模型權重中。
  3. 檢查您的 tf.train.Checkpoint 中的移動平均變量。為了評估,直接從移動平均值而不是非平均權重中恢複您的模型權重。警告:如果您選擇此方法,請在檢查點還原中僅包含平均路徑的 object-graph 路徑。如果您將檢查點恢複中的未平均路徑和平均路徑都指向相同的變量,則很難推斷您的模型是否將恢複平均變量或非平均變量。

保存然後恢複影子變量值的示例:

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...

# Create an ExponentialMovingAverage object, create the shadow variables,
# and grab the moving averages for checkpointing purposes.
# (The ExponentialMovingAverage object itself is not checkpointable)
ema = tf.train.ExponentialMovingAverage(decay=0.9999)
ema.apply([var0, var1])
avg_var0 = ema.average(var0)
avg_var1 = ema.average(var1)

# Create a Checkpoint that will manage the model weights and the averages,
checkpoint = tf.train.Checkpoint(model_weights=[var0, var1],
                                 averaged_weights=[avg_var0, avg_var1])
... # Do training

# Save out the checkpoint including the model weights and the moving averages
checkpoint.save(...)

恢複選項:恢複所有平均和非平均權重,然後通過var.assign()將移動平均線加載到模型中

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...

# Create an ExponentialMovingAverage object, create the shadow variables,
# and grab the moving averages for checkpoint restore purposes.
# (The ExponentialMovingAverage object itself is not checkpointable)
ema = tf.train.ExponentialMovingAverage(decay=0.9999)
ema.apply([var0, var1])
avg_var0 = ema.average(var0)
avg_var1 = ema.average(var1)

# Create a Checkpoint that will manage the model weights and the averages,
checkpoint = tf.train.Checkpoint(model_weights=[var0, var1],
                                 averaged_weights=[avg_var0, avg_var1])
checkpoint.restore(...)
var0.assign(avg_var0)
var1.assign(avg_var1)
# var0 and var1 now hold the moving average values

恢複選項:直接將移動平均線恢複為模型權重。

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...

# Create a Checkpoint that will manage two objects with trackable state,
checkpoint = tf.train.Checkpoint(averaged_weights=[var0, var1])
checkpoint.restore(...)
# var0 and var1 now hold the moving average values

相關用法


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