滑动平均模型(MA)—tensorflow


在采用梯度下降的方式训练神经网络的时候,我们使用滑动平均模型会在一定的程度上提高最终模型在测试集上的表现。

在TensorFlow中提供了tf.train.ExponentialMovingAverage来实现滑动平均模型,在初始化ExponentialMovingAverage的时候,需要提供一个衰减率(decay)。这个衰减率将来控制模型更新的速度,ExponentialMovingAverage对每个变量会维护一个影子变量(shadow variable),这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,影子变量的值会更新为:

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

ExponentialMovingAverage还提供了num_updates参数控制decay的大小。如果在ExponentialMovingAverage中提供了num_updates每次使用的衰减率将是:
m i n { d e c a y , ( 1 + n u m u p d a t e s ) / ( 10 + n u m u p d a t e s ) } min\{decay, (1+num_updates)/(10+num_updates)\} min{decay,(1+numupdates)/(10+numupdates)}

下面通过一段代码解释如何使用:

import tensorflow as tf

v1 = tf.Variable(0, dtype=tf.float32)
step = tf.Variable(0, trainable=False)
ema = tf.train.ExponentialMovingAverage(0.99, step)
maintain_averages_op = ema.apply([v1]) 

with tf.Session() as sess:
    
    # 初始化
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print sess.run([v1, ema.average(v1)])
    
    # 更新变量v1的取值
    sess.run(tf.assign(v1, 5))
    sess.run(maintain_averages_op)
    print sess.run([v1, ema.average(v1)]) 
    
    # 更新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)])       
    
    # 更新一次v1的滑动平均值
    sess.run(maintain_averages_op)
    print sess.run([v1, ema.average(v1)])       

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

全部评论

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务