参考博客: https://blog.csdn.net/kuweicai/article/details/80517284
一、原理
shadow_variable = decay * shadow_variable + (1 - decay) * variable
shadow_variable是之前浅拷贝的旧值, variable是新值。
二、作用
- 1、缓解模型训练时的振荡。
- 2、在模型振荡频率较高的时候有较好的效果。
三、效果
use averaged parameters sometimes produce significantly better results than
the final trained values
四、示例代码
tvars = tf.trainable_variables() #
opt = tf.train.AdamOptimizer(lr)
# Track the moving averages of all trainable variables.
variable_averages = tf.train.ExponentialMovingAverage(0.999, global_step) #
""下面的grads_and_vars其实已经把variable和grad打包zip在一起了""
apply_gradient_op = opt.apply_gradients(grads_and_vars, global_step)
with tf.control_dependencies([apply_gradient_op]): #
train_op = variable_averages.apply(tvars) #
代码后带#的 是使用滑动平均所必需的。