• 学习率的选取-滑动平均


    在神经网络模型中,将 MOVING_AVERAGE_DECAY 设置为 0.99,参数 w1 设置为 0,w1 的滑动平均值设
    置为 0。
    ①开始时,轮数 global_step 设置为 0,参数 w1 更新为 1,则 w1 的滑动平均值为:
    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 更新为 1.644,则滑动平均值变为:
    w1 滑动平均值=min(0.99,101/110)*1.644+(1– min(0.99,101/110)*10 = 2.328
    ④再次运行,参数 w1 更新为 2.328,则滑动平均值:
    w1 滑动平均值=2.956
    代码如下:

    #coding:utf-8
    import tensorflow as tf
    
    #1. 定义变量及滑动平均类
    #定义一个32位浮点变量,初始值为0.0  这个代码就是不断更新w1参数,优化w1参数,滑动平均做了个w1的影子
    w1 = tf.Variable(0, dtype=tf.float32)
    #定义num_updates(NN的迭代轮数),初始值为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([w1])
    #apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。
    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中)
        #打印出当前参数w1和w1滑动平均值
        print "current global_step:", sess.run(global_step)#打印global_step
        print "current w1", sess.run([w1, ema.average(w1)]) #计算滑动平均
        
        # 参数w1的值赋为1
        #tf.assign(A, new_number): 这个函数的功能主要是把A的值变为new_number
        sess.run(tf.assign(w1, 1))
        sess.run(ema_op)
        print "current global_step:", sess.run(global_step)
        print "current w1", sess.run([w1, ema.average(w1)]) 
        
        # 更新global_step和w1的值,模拟出轮数为100时,参数w1变为10, 以下代码global_step保持为100,每次执行滑动平均操作,影子值会更新 
        sess.run(tf.assign(global_step, 100))  #设置global_step为100
        sess.run(tf.assign(w1, 10))#设置W1为10
        sess.run(ema_op)#运行ema_op
        print "current global_step:", sess.run(global_step)#打印
        print "current w1:", sess.run([w1, ema.average(w1)])  #打印     
        
        # 每次sess.run会更新一次w1的滑动平均值
        sess.run(ema_op)
        print "current global_step:" , sess.run(global_step)
        print "current w1:", sess.run([w1, ema.average(w1)])
    
        sess.run(ema_op)
        print "current global_step:" , sess.run(global_step)
        print "current w1:", sess.run([w1, ema.average(w1)])
    
        sess.run(ema_op)
        print "current global_step:" , sess.run(global_step)
        print "current w1:", sess.run([w1, ema.average(w1)])
    
        sess.run(ema_op)
        print "current global_step:" , sess.run(global_step)
        print "current w1:", sess.run([w1, ema.average(w1)])
    
        sess.run(ema_op)
        print "current global_step:" , sess.run(global_step)
        print "current w1:", sess.run([w1, ema.average(w1)])
    
        sess.run(ema_op)
        print "current global_step:" , sess.run(global_step)
        print "current w1:", sess.run([w1, ema.average(w1)])

    从运行结果可知,最初参数 w1 和滑动平均值都是 0;参数 w1 设定为 1 后,滑动平均值变为 0.9;
    当迭代轮数更新为 100 轮时,参数 w1 更新为 10 后,滑动平均值变为 1.644。随后每执行一次,参数
    w1 的滑动平均值都向参数 w1 靠近。可见,滑动平均追随参数的变化而变化。

  • 相关阅读:
    【图片加载大小优化】
    img标签实现和背景图一样的显示效果——object-fit和object-position
    【ios bug解决】 输入框聚焦时光标不显示
    service worker 实现页面通信
    【获取url 问号后参数】防中文乱码
    js去掉url后某参数【函数封装】
    ES6字符串模板
    ES6扩展运算符和rest运算符
    ES6变量的解构赋值
    ES6新的声明方式,var let const三种声明方式的区别
  • 原文地址:https://www.cnblogs.com/fcfc940503/p/10961124.html
Copyright © 2020-2023  润新知