tensorflow 滑动平均模型
注:
1.影子变量的功能是记录滑动平均值,滑动平均值并不会改变原始变量的值
2.decay的更新并不是递归...
import tensorflow as tf v1 = tf.Variable(0, dtype = tf.float32)#定义变量用来计算滑动平均,初始化为0,shadow_variable = 0 step = tf.Variable(0, trainable = False)#定义滑动平均的step,初始化为0 #定义滑动平均的类,初始化时给定衰减率0.99,step为0 ema = tf.train.ExponentialMovingAverage(0.99, step) maintain_average_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)])) #输出[0.0, 0.0] sess.run(tf.assign(v1, 5))#更新v1的值到5 sess.run(maintain_average_op)#更新v1的滑动平均值,decay = min{0.99, (1 + 0) / (10 + 0)} = 0.1, shadow_variable = 0.1 * 0 + 0.9 * 5 = 4.5 print(sess.run([v1, ema.average(v1)])) #输出[5.0, 4.5] sess.run(tf.assign(step, 1000))#更新step为1000 sess.run(tf.assign(v1, 10))#更新v1的值为10 sess.run(maintain_average_op) # 更新v1的滑动平均值,decay = min{0.99, (1 + 1000) / (10 + 1000)} = 0.99, shadow_variable = 0.99 * 4.5 + 0.01 * 10 = 4.555 print(sess.run([v1, ema.average(v1)])) # 输出[10, 4.5549998] sess.run(maintain_average_op) # 更新v1的滑动平均值,decay = min{0.99, (1 + 1000) / (10 + 1000)} = 0.99, shadow_variable = 0.99 * 4.555 + 0.01 * 10 = 4.60945 print(sess.run([v1, ema.average(v1)])) # 输出[10, 4.6094499]