tf.train.ExponentialMovingAverage

  该函数用于更新参数,就是采用滑动平均的方法更新参数:

tf.train.ExponentialMovingAverage(decay, steps)

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

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

shadow_variable是影子变量;variable表示待更新的变量,也就是变量被赋予的值;decay为衰减速率,一般设为接近于1的数(0.990.999),其越大模型越稳定,因为decay越大,参数更新的速度就越慢,趋于稳定。
  tf.train.ExponentialMovingAverage这个函数还提供了自己动更新decay的计算方式:

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

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

import tensorflow as tf
import numpy as np

v1 = tf.Variable(0, dtype=tf.float32)
step = tf.Variable(tf.constant(0))
ema = tf.train.ExponentialMovingAverage(0.99, step)
maintain_average = ema.apply([v1])

with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run(init)
    print(sess.run([v1, ema.average(v1)]))  # 初始的值都为0
    sess.run(tf.assign(v1, 5))  # 把v1变为5
    sess.run(maintain_average)
    # “decay = min(0.99, 1/10) = 0.1”,“v1 = 0.1 * 0 + 0.9 * 5 = 4.5”
    print(sess.run([v1, ema.average(v1)]))
    sess.run(tf.assign(step, 10000))  # steps = 10000
    sess.run(tf.assign(v1, 10))  # v1 = 10
    sess.run(maintain_average)
    # “decay = min(0.99, (1 + 10000)/(10 + 10000)) = 0.99”,“v1 = 0.99 * 4.5 + 0.01 * 10 = 4.555”
    print(sess.run([v1, ema.average(v1)]))
    sess.run(maintain_average)
    # “decay = min(0.99, (1 + 10000)/(10 + 10000)) = 0.99”,“v1 = 0.99 * 4.555 + 0.01 * 10 = 4.6”
    print(sess.run([v1, ema.average(v1)]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值