lesson18 滑动平均值

https://www.bilibili.com/video/av22530538/?p=18

 

#lesson18  滑动平均值
#
#滑动平均(影子值):记录了每个参数一段时间内过往值的平均,增加了模型的泛化性。
#针对所有参数:w和b(像是给参数加了影子,参数变化,影子缓慢追随。)
#影子=衰减率*影子 +(1-衰减率)*参数       影子初值=参数初值
#衰减率 = min「MOVING_AVERAGE_DECAY. 1+轮数/10+轮数」

#MOVING_AVERAGE_DECAY为0.99,参数w1为0,轮数global_step为0,w1的滑动平均值为0
#参数w1更新为1则:
#w1滑动平均值=min(0.99,1/10)*0+(1-min(0.99,1/10)*1)=0.9
#轮数global_step为100时,参数w1更新为10测:
#w1滑动平均值=min(0.99,101/110)*0.9+(1-min(0.99,101/110)*10)=0.826+0.818=1.644
#再次运行
#w1滑动平均值=min(0.99,101/110)*1.644+(1-min(0.99,191/110)*10)=2.328
#再次运行
#w1滑动平均值=2.956

#ema = tf.train.ExponentialMovingAverage(
#衰减率MOVING_AVERAGE_DECAY,
#当前轮数global_step)
#ema_op=ema.apply([])
#ema_op = ema.apply(tf.trainale_variables())

#
#with if.control_dependencies([train_step,ema_op]):
#    train_op = tf.no_op(name='train')
#ema.average(参数名)  查看某参数的滑动平均值

import tensorflow as tf

#1定义变量及滑动平均类
#定义一个32位浮点变量,初始化值位0.0 这个代码就是不断更新w1参数,优化w1参数
#滑动平均做类个w1的影子
w1 = tf.Variable(0,dtype=tf.float32)
#定义num——updates(NN的迭代轮数global_step)
global_step = tf.Variable(0, trainable=False)
MOVING_AVERAGE_DECAY = 0.99

ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
#ema.apply后的是更新列表,每次运行sess.run(ema_op)时,对更新列表中
#的元素求滑动平均均值
#在实际应用中会使用tf/trainable_variables()自动将所有待训练的参数汇总位列表
#ema_op = ema.apply([w1])
ema_op = ema.apply(tf.trainable_variables())

#2查看不同迭代中变量取值的变化。
with tf.Session() as sess:
    #初始化
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    #用ema.average(w1)获取w1滑动平均值(要运行多个节点,作为列表中的元素列出
    #写在sess.run中)
    print(sess.run([w1, ema.average(w1)]))
    #参数w1的值赋位1
    sess.run(tf.assign(w1, 1))
    sess.run(ema_op)
    print(sess.run([w1, ema.average(w1)]))   
    
    #更新step和w1的值,模拟出100轮迭代后,参数w1变位10
    sess.run(tf.assign(global_step, 100))
    sess.run(tf.assign(w1, 10))
    sess.run(ema_op)
    print(sess.run([w1, ema.average(w1)]))  
    #每次sess.run会更新一次w1的滑动平均值
    sess.run(ema_op)
    print(sess.run([w1, ema.average(w1)])) 
    
    sess.run(ema_op)
    print(sess.run([w1, ema.average(w1)])) 
    
    sess.run(ema_op)
    print(sess.run([w1, ema.average(w1)])) 
    
    sess.run(ema_op)
    print(sess.run([w1, ema.average(w1)])) 
    
    sess.run(ema_op)
    print(sess.run([w1, ema.average(w1)])) 
    
    sess.run(ema_op)
    print(sess.run([w1, ema.average(w1)])) 
#更改MOVING_AVERAGE_DECAY为0.1 看影子追随速度
结果:
[0.0, 0.0]
[1.0, 0.9]
[10.0, 1.6445453]
[10.0, 2.3281732]
[10.0, 2.955868]
[10.0, 3.532206]
[10.0, 4.061389]
[10.0, 4.547275]
[10.0, 4.9934072]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值