這個函數可以參考吳恩達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]