初始化ExponentialMovingAverage:
1.利用decay(衰减率),控制模型更新速度;2.为每一个变量付应一个shadow variable, 并且shadow variable的初始值为对应变量的初始值,而shadow variable的值会随着每次运行中相应变量发生更新而变化;shadow variable的值为:
shadow_variable = decay*shadow_variable+(1-decay)*variable #variable为待更新的变量,decay为衰减率
由公式可得:decay决定模型的更新速度;
在ExponentialMovingAverage通过num_updates参数来动态实现decay的大小。
若在初始化中提供num_updates参数,则每次使用的衰减率为:
min = {decay,(1+num_updates)/(10+num_updates))}
import tensorflow as tf
v1 = tf.Variable(0,dtype=tf.float32) #定义一个变量,初始值为0
step = tf.Variable(0,trainable=False) #step为迭代轮数变量,控制衰减率
ema = tf.train.ExponentialMovingAverage(0.99,step) #初始设定衰减率为0.99
maintain_averages_op = ema.apply([v1]) #更新列表中的变量
with tf.Session() as sess:
init_op = tf.initialize_all_variables() #初始化所有变量
sess.run(init_op)
print(sess.run([v1,ema.average(v1)])) #输出初始化后变量v1的值和v1的滑动平均值
sess.run(tf.assign(v1,5)) #更新v1的值
sess.run(maintain_averages_op) #更新v1的滑动平均值
print(sess.run([v1,ema.average(v1)]))
sess.run(tf.assign(step,10000)) #更新迭代轮转数step
sess.run(tf.assign(v1,10))
sess.run(maintain_averages_op)
print(sess.run([v1,ema.average(v1)]))
#再次更新滑动平均值,
sess.run(maintain_averages_op)
print(sess.run([v1,ema.average(v1)]))
#更新v1的值为15
sess.run(tf.assign(v1,15))
sess.run(maintain_averages_op)
print(sess.run([v1,ema.average(v1)]))