滑动平均模型
在tensorflow中提供 tf.train.ExponentialMovingAverage来实现滑动平均模型。在初始化的时候,需要体动一个衰减率(decay)。用于控制模型更新的速度。
ExponentialMovingAverage对每一个变量会维护一个影子变量(shadowvariable)初始值是相对应的初始值。每次运行变量更新时,影子变量也是会自动更新:
shadow_variable = decay * shadow_variable + (1 - decaay)*variable
shadow_variable:影子变量
variable:待更新的变量
decay:衰减率 决定更新的速度,越大越稳定(一般接近于1)
如果在ExponentialMovingAverage初始化时提供了num_updates参数,每次的衰减率将是
min{decay,1+num_updates/10+num_updates}
import tensorflow as tf
#1. 定义变量及滑动平均类
v1 = tf.Variable(0, dtype=tf.float32)
step = tf.Variable(0, trainable=False)
ema = tf.train.ExponentialMovingAverage(decay=0.99, num_updates=step)
# 每一次操作的时候,列表变量[v1]都会被更新
maintain_averages_op = ema.apply([v1])
#2. 查看不同迭代中变量取值的变化。tf.assign用于变更变量的数值
with tf.Session() as sess:
# 初始化
init_op = tf.global_variables_initializer()
sess.run(init_op)
print(sess.run([v1, ema.average(v1)]))
# 更新变量v1的取值
sess.run(tf.assign(v1, 5))
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))
# 更新step和v1的取值
sess.run(tf.assign(step, 10000))
sess.run(tf.assign(v1, 10))
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))
# 更新一次v1的滑动平均值
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))