滑动平均

滑动平均

滑动平均(影子值):记录了每个参数一段时间内过往值的平均,增加了模型了泛化性。

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

其中:

shadow_variable :影子变量

variable:待更新的变量

decay:衰减率,衰减率决定了模型更新的速度

tensorFlow中的使用

import tensorflow as tf
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"  # 忽略tensorflow警告信息

MOVING_AVERAGE_DECAY = 0.99 #滑动衰减率为0.99,

v1 = tf.Variable(0,dtype=tf.float32) #变量赋初值
step = tf.Variable(0,trainable=False) #计数器

#定义一个滑动平均的类
ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,step)
ema_op = ema.apply([v1]) #定义一个更新变量滑动平均的操作,这里给的是一个列表,每次执行,都会更新。

with tf.Session() as sess:
    #初始化全部变量
    init_op = tf.global_variables_initializer()
    sess.run(init_op)

    #通过ema.average(v1)获得滑动平均后的变量的值
    print(sess.run([v1,ema.average(v1)]))
    #输出[0.0,0.0]

    #更新参数v1
    sess.run(tf.assign(v1,5))
    sess.run(ema_op) #执行一次更新
    print(sess.run([v1,ema.average(v1)]))
    #输出结果[5.0, 4.5]

    sess.run(ema_op)
    print(sess.run([v1, ema.average(v1)]))
    #输出结果:[5.0, 4.95]

    #更新step的值
    sess.run(tf.assign(step,10000))
    sess.run(tf.assign(v1,10))
    sess.run(ema_op)
    print(sess.run([v1,ema.average(v1)]))
    #输出[10.0, 5.0004997]

    sess.run(ema_op)
    print(sess.run([v1,ema.average(v1)]))
    #输出[10.0, 5.0504947]

在使用,经常使用一下结构

#(1)    
ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
#MOVING_AVERAGE_DECAY 衰减率
#global_step 当前轮数
#(2)
ema_op = ema.apply([]) #填入待更新的参数,这里以列表的形式
#(3)
with tf.control_dependencies([train_step,ema_op]):
    train_op = tf.no_op(name='train')

猜你喜欢

转载自blog.csdn.net/plSong_CSDN/article/details/88362892