tensorflow笔记神经网络优化之滑动平均

滑动平均(影子值):记录了每个参数一段时间内过往值的平均,增加了模型的泛化性。针对所有参数:W和b
滑动平均的感觉就好像是给参数加了影子,参数变化,影子也缓慢跟随。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
衰减率是滑动平均的一个超参数值,一般给一个较大的值。当前轮数是和程序中的其他的轮数共用。
ema.apply()列出了对括号中的参数求滑动平均。在实际中使用tf.trainable_vaeiables()将待训练的参数训练成列表。
在实际应用中常常将计算滑动平均和训练过程一起完成。
在这里插入图片描述

import tensorflow as tf

#1.定义变量及滑动平均类
#定义一个32位的浮点变量,初始值为0.0 这个代码就是不断更新w1的参数,滑动平均做了一个
#w1的影子。
W1=tf.Variable(0,dtype=tf.float32)

#定义num_updates(神经网络的迭代轮数),初始值为0,这个参数不训练。
global_step=tf.Variable(0,trainable=False)

#实例化滑动平均类,给衰减率为0.99,当前轮数global_step
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(tf.trainable_variables())
#ema_op 是滑动平均节点


#2。查看不同迭代中变量取值的变化
with tf.Session() as sess:
    #初始化
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    #用ema.average(w1)获得w1的滑动平均值,(要运行多个节点,作为列表中的元素列出,写在sess.run中
    #)
    #打印出当前参数w1和w1d的滑动平均值
    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)]))
发布了110 篇原创文章 · 获赞 72 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_40605167/article/details/102288829