关于为什么使用滑动平均模型?1.使用最后滑动平均模型技术更新后的变量(权值,偏置),可以使最后训练的模型在测试数据上表现的更加健壮。为什么会更加健壮呢?因为可以降低周期性不稳定数据和一些数据噪声的影响(什么是数据噪声呢,也就是异常的数据)。仔细想一下,滑动平均我们可以相称每次更新后取的是变量的平均值,所以数据噪声,或者周期性变动很大的数据会被平均下来,但是异常数据毕竟少数,所以我们可以预测整体趋势,所以会在测试数据上表现的更加健壮。
#滑动平均模型的运用
import tensorflow as tf
a = tf.Variable(0,dtype=tf.float32)
step = tf.Variable(0,dtype=tf.float32 )#模拟实际训练模型的步数
ema = tf.train.ExponentialMovingAverage(decay=0.99,num_updates=step)#返回一个滑动平均对象
op = ema.apply([a])#对a使用滑动平均
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([a,ema.average(a)]))#ema.average(a)返回在a上使用滑动平均后的值,也就是在使用过后apply()函数后的值
#滑动平均模型计算的公式=decay*shawdow_variable+(1-decay)*variable decay=min{0.99,(1+step)/(10+step)}
#为a赋值5 ema.average(a)= 0.1*0+0.9*5=4.5 根据上面公式decay=0.1
sess.run(tf.assign(a,5))
sess.run(op)
print(sess.run([a,ema.average(a)]))
#ema.average(a)=0.99*4.5+0.01*10=4.5549998 根据上面公式decay = 0.99111111111
sess.run(tf.assign(step,10000))
sess.run(tf.assign(a,10))
sess.run(op)
print(sess.run([a,ema.average(a)]))
结果:
[0.0, 0.0]
[5.0, 4.5]
[10.0, 4.5549998]