随机梯度下降算法训练时, 使用滑动平均模型 可以提高模型健壮性.
在 Tensorflow 中提供了 tf.train.ExponentialMovingAverage 来实现滑动平均模型. 在初始化 ExponentialMovingAverage 时, 需要提供一个衰减率. 控制模型更新速度, 它对每个变量会维护一个影子变量, 这个影子变量的初始值 就是相应变量的初始值 , 而每次运行变量更新时, 影子变量的值会更新为:
shadow_variable 为影子变量, variable 为待更新变量.
decay 为模型更新的速度, 越大, 模型越稳定, 一般为 0.999.
为了使模型在训练前期可更新得更快, ExponentialMovingAverage 还提供了 num_updates 参数来动态设置 decay 的大小.
如果, 在 ExponentialMovingAverage 初始化时, 提供了 num_updates 参数, 那么每次使用衰减率将是:
- #!/usr/bin/env python2
- # -*- coding: utf-8 -*-
- """
- Created on Fri Sep 28 10:00:44 2018
- @author: myhaspl
- @email:myhaspl@myhaspl.com
- 滑动平均模型
- """
- from __future__ import division
- import tensorflow as tf
- import numpy as np
- def averageOp(shawv,v,decay,step):
- nowdecay=min(decay,(1+step)/(10+step))#step 即 num_updates
- return shawv*nowdecay+(1-nowdecay)*v
- w=tf.Variable([0.,0.],dtype=tf.float32)
- step=tf.Variable(0,dtype=tf.int32,trainable=False)
- ema=tf.train.ExponentialMovingAverage(0.99,step)
- maintainAverageOp=ema.apply([w])# 更新 w 的操作, 更新的方式是滑动平均算法
- init=tf.global_variables_initializer()
- with tf.Session() as sess:
- sess.run(init)
- v,shawv,vstep=sess.run([w,ema.average(w),step])
- print averageOp(shawv,v,0.99,vstep)
- sess.run(tf.assign(w,np.array([2.,6.])))
- v,shawv,vstep=sess.run([w,ema.average(w),step])
- print averageOp(shawv,v,0.99,vstep)
- sess.run(maintainAverageOp)
- print sess.run([w,ema.average(w)])#ema.average(w) 表示获取滑动平均值
- [0. 0.]
- [1.8 5.3999996]
- [array([2., 6.], dtype=float32), array([1.8 , 5.3999996], dtype=float32)]
来源: http://www.bubuko.com/infodetail-2856416.html