《Tensorflow实战Google深度学习》4.43滑动平均模型

  滑动平均模型

在tensorflow中提供 tf.train.ExponentialMovingAverage来实现滑动平均模型。在初始化的时候,需要体动一个衰减率(decay)。用于控制模型更新的速度。

ExponentialMovingAverage对每一个变量会维护一个影子变量(shadowvariable)初始值是相对应的初始值。每次运行变量更新时,影子变量也是会自动更新:

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

shadow_variable:影子变量

variable:待更新的变量

decay:衰减率   决定更新的速度,越大越稳定(一般接近于1)

如果在ExponentialMovingAverage初始化时提供了num_updates参数,每次的衰减率将是

min{decay,1+num_updates/10+num_updates}

import tensorflow as tf
#1. 定义变量及滑动平均类
v1 = tf.Variable(0, dtype=tf.float32)
step = tf.Variable(0, trainable=False)
ema = tf.train.ExponentialMovingAverage(decay=0.99, num_updates=step)
# 每一次操作的时候,列表变量[v1]都会被更新
maintain_averages_op = ema.apply([v1])
#2. 查看不同迭代中变量取值的变化。tf.assign用于变更变量的数值
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)]))

猜你喜欢

转载自blog.csdn.net/GAIYA2050/article/details/81142719