这个函数可以参考吴恩达deeplearning.ai中的指数加权平均。
和指数加权平均不一样的是,tensorflow中提供的这个函数,能够让decay_rate随着step的变化而变化。(在训练初期的时候,较小,在训练后期的时候,回归到比较大的情况)
公式是这样的:
decay= min(decay,(1+steps)/(10+steps))
注:(吴恩达讲的修正方法是用计算出来的shadow_variable除以(1-beta^t),其中beta即为上面的decay_rate, 其中t越大,括号里的值越接近1,因为beta是一个小于1的数)
在tensorflow中应用这个函数可以这样:
import tensorflow as tf
v = tf.Variable(0, dtype=tf.float32)
step = tf.Variable(0, trainable=False)
ema = tf.train.ExponentialMovingAverage(0.9, step)
maintain_average = ema.apply([v])
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init) #print initial value
print(sess.run([v, ema.average(v)])) sess.run(tf.assign(v, 5))
sess.run(maintain_average)
print(sess.run([v, ema.average(v)])) sess.run(tf.assign(v, 5))
sess.run(maintain_average)
print(sess.run([v, ema.average(v)]))
上面的代码有以下几点要注意:
1) 定义好ema之后,分两步,一步ema.apply,一步ema.average
2) 先apply,后average
3) apply里放的是一个list
4) Variable通过tf.assign改动
上面代码的运行结果:
[0.0, 0.0]
[5.0, 4.5]
[5.0, 4.9499998]