Tensorflow中提供tf.train.ExponentialMovingAverage函數實現(滑動平均模型)

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章