初始化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)]))