class6--tensorflow:滑动平均

滑动平均(影子值):记录了每个参数一段时间内过往值的平均,增加了模型的泛化性

针对所有参数:w和b

影子=衰减率×影子+(1-衰减率)×参数         影子初值=参数初值


这个例子并没有很好的模拟参数更新。

import tensorflow as tf

#定义变量及滑动平均
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])
ema_op=ema.apply(tf.trainable_variables())

with tf.Session() as sess:
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    #用ema.average(w1)获取w1的滑动平均值 
    print(sess.run([w1,ema.average(w1)]))

    sess.run(tf.assign(w1,1))
    sess.run(ema_op)
    print(sess.run([w1,ema.average(w1)]))   

    sess.run(tf.assign(global_step,100))
    sess.run(tf.assign(w1,10))
    sess.run(ema_op)
    print(sess.run([w1,ema.average(w1)]))

    for i in range(50):
        sess.run(ema_op)
        print(sess.run([w1,ema.average(w1)]))


 

ema=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)

ema_op=ema.apply([])

#滑动平均节点ema_op

ema_op=ema.apply(tf.trainable_variables())运行此句,所有待优化的参数会汇总成列表然后求滑动平均


在工程运用中,常把滑动平均和训练过程汇合成一个节点

with tf.control_dependencies([train_step,ema_op]):

    train_op=tf.no_op(name="train")


ema.average(参数名)#返回某参数的滑动平均值


这个通过之间的应用写进去了。。最后结果确实是影子很接近参数w

#建立一个两层网络,输入层2,中间层3,输出层1

import tensorflow as tf
import numpy as np
BATCH_SIZE=40
seed=23455

#虚拟样本,基于seed生成随机数
rng=np.random.RandomState(seed)
#随机生成
X=rng.rand(80,2)
#生成标签 0、1
Y=[[x1+x2+(rng.rand()/10.0-0.05)] for (x1,x2) in X]

x=tf.placeholder(tf.float32)
y_=tf.placeholder(tf.float32)

w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=0))
b1=tf.Variable(tf.ones([1,3]))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=0))
b2=tf.Variable(tf.ones([1,1]))

a0=tf.add(tf.matmul(x,w1),b1)
y0=tf.add(tf.matmul(a0,w2),b2)

a=tf.nn.relu(a0)
y=tf.nn.relu(y0)

global_step=tf.Variable(0,tf.float32)
MOVING_AVERAGE_DECAY=0.99
ema=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
ema_op=ema.apply([w1])

#定义loss和反向传播方法
learning_rate=0.001
loss=tf.reduce_sum(tf.square(y-y_))
train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
#train_step=tf.train.MomentumOptimizer(learning_rate,momentum=0.1).minimize(loss)
#train_step=tf.train.AdamOptimizer(learning_rate,beta1=0.9,beta2=0.999).minimize(loss)
with tf.Session() as sess:
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    STEPS=20000
    for i in range(STEPS):
        start=(i*BATCH_SIZE)%80
        end=start+BATCH_SIZE
        sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
        if i%2000 == 0:
            total_loss=sess.run(loss,feed_dict={x:X,y_:Y})
            #print("a0_val is",a0_val,"y0_val is",y0_val,"a_val is",a_val,"y_val is",y_Val,"\n")
            print("%d:loss:%g",i,total_loss)
            sess.run(ema_op)
            print(sess.run([w1,ema.average(w1)]))


滑动平均一般用以用前一段时间的数据来预测当前数据,可以x(n)=w1x(n-1)+w2x(n-2)+...+wmx(n-m),每个时期的值前有一个权重,因为接近当前时刻的数据可能更具有代表性,但不全是如此,例如该产品的销量具有季节性的需求,所以应用到具体案例中需要具体分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值