tf.train.ExponentialMovingAverage的用法

tf.train.ExponentialMovingAverage(decay, steps)

tf.train.ExponentialMovingAverage这个函数用于更新参数,就是采用滑动平均的方法更新参数。这个函数初始化需要提供一个衰减速率(decay),用于控制模型的更新速度。这个函数还会维护一个影子变量(也就是更新参数后的参数值),这个影子变量的初始值就是这个变量的初始值,影子变量值的更新方式如下:

shadow_variable = decay * shadow_variable + (1-decay) * variable

shadow_variable是影子变量,variable表示待更新的变量,也就是变量被赋予的值,decay为衰减速率。decay一般设为接近于1的数(0.99,0.999)。decay越大模型越稳定,因为decay越大,参数更新的速度就越慢,趋于稳定。

tf.train.ExponentialMovingAverage这个函数还提供了自己动更新decay的计算方式:

decay= min(decay,(1+steps)/(10+steps))

steps是迭代的次数,可以自己设定。

比如:

[python] view plain copy
  1. import tensorflow as tf;  
  2. import numpy as np;  
  3. import matplotlib.pyplot as plt;  
  4.   
  5. v1 = tf.Variable(0, dtype=tf.float32)  
  6. step = tf.Variable(tf.constant(0))  
  7.   
  8. ema = tf.train.ExponentialMovingAverage(0.99, step)  
  9. maintain_average = ema.apply([v1])  
  10.   
  11. with tf.Session() as sess:  
  12.     init = tf.initialize_all_variables()  
  13.     sess.run(init)  
  14.   
  15.     print sess.run([v1, ema.average(v1)]) #初始的值都为0  
  16.   
  17.     sess.run(tf.assign(v1, 5)) #把v1变为5  
  18.     sess.run(maintain_average)  
  19.     print sess.run([v1, ema.average(v1)]) # decay=min(0.99, 1/10)=0.1, v1=0.1*0+0.9*5=4.5  
  20.   
  21.     sess.run(tf.assign(step, 10000)) # steps=10000  
  22.     sess.run(tf.assign(v1, 10)) # v1=10  
  23.     sess.run(maintain_average)  
  24.     print sess.run([v1, ema.average(v1)]) # decay=min(0.99,(1+10000)/(10+10000))=0.99, v1=0.99*4.5+0.01*10=4.555  
  25.   
  26.     sess.run(maintain_average)  
  27.     print sess.run([v1, ema.average(v1)]) #decay=min(0.99,<span style="font-family:Arial, Helvetica, sans-serif;">(1+10000)/(10+10000)</span><span style="font-family:Arial, Helvetica, sans-serif;">)=0.99, v1=0.99*4.555+0.01*10=4.6</span>  
输出:

[0.0, 0.0]
[5.0, 4.5]
[10.0, 4.5549998]
[10.0, 4.6094499]

解释:每次更新完以后,影子变量的值更新,varible的值就是你设定的值。如果在下一次运行这个函数的时候你不在指定新的值,那就不变,影子变量更新。如果指定,那就variable改变,影子变量也改变

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值