美文网首页
滑动平均模型

滑动平均模型

作者: Thinkando | 来源:发表于2018-11-23 22:09 被阅读50次
    • 一阶滞后滤波法:
      image.png
      其中a的取值范围[0,1],具体就是:本次滤波结果=(1-a)本次采样值+a上次滤波结果,采用此算法的目的是:
      1、降低周期性的干扰;
      2、在波动频率较高的场合有很好的效果。
    • 而在TensorFlow中提供了tf.train.ExponentialMovingAverage 来实现滑动平均模型,在采用随机梯度下降算法训练神经网络时,使用其可以提高模型在测试数据上的健壮性(robustness)。
    • TensorFlow下的 tf.train.ExponentialMovingAverage 需要提供一个衰减率decay。该衰减率用于控制模型更新的速度。该衰减率用于控制模型更新的速度,ExponentialMovingAverage 对每一个待更新的变量(variable)都会维护一个影子变量(shadow variable)。影子变量的初始值就是这个变量的初始值.
    image.png
    • 上述公式与之前介绍的一阶滞后滤波法的公式相比较,会发现有很多相似的地方,从名字上面也可以很好的理解这个简约不简单算法的原理:平滑、滤波,即使数据平滑变化,通过调整参数来调整变化的稳定性。
    • 在滑动平滑模型中, decay 决定了模型更新的速度,越大越趋于稳定。实际运用中,decay 一般会设置为十分接近 1 的常数(0.999或0.9999)。为了使得模型在训练的初始阶段更新得更快,ExponentialMovingAverage 还提供了 num_updates 参数来动态设置 decay 的大小:
    image.png
    • 一般一开始会选择后面的,随着次数的增加会选择前面的
    import tensorflow as tf
    v1 = tf.Variable(0, dtype=tf.float32) #初始化v1变量
    step = tf.Variable(0, trainable=False) #初始化step为0
    ema = tf.train.ExponentialMovingAverage(0.99, step) #定义平滑类,设置参数以及step
    maintain_averages_op = ema.apply([v1]) #定义更新变量平均操作, # apply的返回值就是函数func函数的返回值
    with tf.Session() as sess:
        # 初始化
        init_op = tf.global_variables_initializer()
        sess.run(init_op)
        print (sess.run([v1, ema.average(v1)])) # [0.0, 0.0]
    
        # 更新变量v1的取值
        sess.run(tf.assign(v1, 5))
        sess.run(maintain_averages_op)
        print (sess.run([v1, ema.average(v1)])) # [5.0, 4.5]
    
        # 更新step和v1的取值
        sess.run(tf.assign(step, 10000))
        sess.run(tf.assign(v1, 10))
        sess.run(maintain_averages_op)
        print (sess.run([v1, ema.average(v1)])) # [10.0, 4.555]
    
        # 更新一次v1的滑动平均值
        sess.run(maintain_averages_op)
        print (sess.run([v1, ema.average(v1)])) # [10.0, 4.60945]
    
    image.png

    参考文献

    1. https://oldpan.me/archives/tensorflow-movingaverage

    相关文章

      网友评论

          本文标题:滑动平均模型

          本文链接:https://www.haomeiwen.com/subject/vlolqqtx.html