tensorflow-滑動平均模型
阿新 • • 發佈:2018-11-22
隨機梯度下降演算法訓練時,使用滑動平均模型 可以提高模型健壯性。
在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:[email protected] 滑動平均模型 """ 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)]