通過采用 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...
有幾種方法可以使用移動平均線進行評估:
- 在評估您的模型之前,使用
Variable.assign(...)
將陰影變量的值分配給您的模型變量。您可以使用average()
方法來獲取給定變量的影子變量。要在使用這種方法後繼續訓練,請確保在繼續訓練之前記錄未平均的權重並恢複它們。您可以查看 tensorflow-addons' MovingAverage 優化器的swap_weights
方法,了解如何在分布式設置中有效交換變量的一個示例:https://github.com/tensorflow/addons/blob/v0.13.0/tensorflow_addons/optimizers /moving_average.py#L151 - 確保在
tf.train.Checkpoint
中檢查出移動平均變量。在評估時,創建您的影子變量並使用tf.train.Checkpoint
將移動平均線恢複到影子變量中。然後,通過var.assign(moving_avg)
將移動平均值加載到實際模型權重中。 - 檢查您的
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
相關用法
- Python tf.train.Coordinator.stop_on_exception用法及代碼示例
- Python tf.train.Checkpoint.restore用法及代碼示例
- Python tf.train.Checkpoint.read用法及代碼示例
- Python tf.train.CheckpointOptions用法及代碼示例
- Python tf.train.list_variables用法及代碼示例
- Python tf.train.ClusterSpec用法及代碼示例
- Python tf.train.Checkpoint.save用法及代碼示例
- Python tf.train.Checkpoint.write用法及代碼示例
- Python tf.train.Coordinator用法及代碼示例
- Python tf.train.CheckpointManager用法及代碼示例
- Python tf.train.Checkpoint用法及代碼示例
- Python tf.transpose用法及代碼示例
注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.train.ExponentialMovingAverage。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。