语法:tf.train.ExponentialMovingAverage(decay,num_updates=None)
参数说明:
- decay为衰减率。控制模型更新的速度,它的值越大模型越趋于稳定。实际应用中,decay一般会设置为十分接近1的常数(0.99或0.999)。
- num_updates动态设置decay的大小。使得模型在训练的初始阶段更新得更快。
ExponentialMovingAverage 对每一个变量(variable)都会维护一个 影子变量(shadow variable)。影子变量的初始值就是这个变量的初始值,而每次运行变量更新时,影子变量的值会更新为:
实例代码演示:
import tensorflow as tf
v1 = tf.Variable(0, dtype=tf.float32) #初始值设为0
#step模拟神经网络中的迭代轮数,来动态控制衰减率
step = tf.Variable(0, trainable=False)
ema = tf.train.ExponentialMovingAverage(0.99, step)
#定义一个更新滑动平均的操作
maintain_averages_op = ema.apply([v1])
with tf.Session() as sess:
init_op = tf.global_variables_initializer() #初始化
sess.run(init_op)
print(sess.run([v1, ema.average(v1)]))
sess.run(tf.assign(v1,5)) #更新v1的值为5
sess.run(maintain_averages_op) #滑动平均操作
#通过ema.average(v1)获得滑动平均之后变量的取值
print (sess.run([v1, ema.average(v1)]))
sess.run(tf.assign(step, 10000)) #更新step的值为10000
sess.run(tf.assign(v1, 10)) #更新v1的值为10
sess.run(maintain_averages_op)
print (sess.run([v1, ema.average(v1)]))
#当前v1的值和step值保持不变,更新一次v1的滑动平均值
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))