当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。