动量方法原理(参考神经网络设计)

滑动平均模型仿真_ ExponentailMovingAverage

tensorflow中的滑动平均使用

滑动平均模型仿真_ ExponentailMovingAverage

 

实验过程:

1.生成正玄信号

2.创建tensorflow计算图

         1)创建滑动平均模型

           ema = tf.train.ExponentialMovingAverage(0.99,step)

        2)用于计算的张量

              maintain_averages_op = ema.apply([v1]) #计算张量

         3)用于取值的张量
             ema_average_op = ema.average(v1) # 取值张量

3.执行计算

        1)更新滑动平均的输入

            sess.run(tf.assign(v1,sin_y[i]))

        2)更新衰减系数

            sess.run(tf.assign(step, i * 2))

        3)计算滑动平均

             sess.run(maintain_averages_op)

        4)读取滑动平均结果,加入列表保存下来

             var_.append(sess.run(ema_average_op)) #读取数据

实验代码:


import tensorflow as tf
import math
import matplotlib.pyplot as plt
#生成正玄信号
N = 1000
FS = 10
sin_x = [2 * math.pi * FS * t /N for t in range(N)]
sin_y = [math.sin(i) for i in sin_x]
#创建滤波图
v1 = tf.Variable(0,dtype=tf.float32)
step = tf.Variable(0,trainable=False)
ema = tf.train.ExponentialMovingAverage(0.99,step)
maintain_averages_op = ema.apply([v1]) #计算张量
ema_average_op = ema.average(v1) # 取值张量
#variables_to_restore = ema.variables_to_restore() # 记录加载历史变量
var_ = []  #保存滑动平均后的变量
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    for i in range(N):
        #sess.run(tf.assign(v1,i)) #给v1赋值,作为滑动平均输入
        sess.run(tf.assign(v1,sin_y[i])) #给v1赋值,作为滑动平均输入
        sess.run(tf.assign(step, i * 2)) # 给step赋值,调节滑动平均系数
        sess.run(maintain_averages_op) # 计算滑动平均结果
        #print(sess.run([v1,ema_average_op])) #读取滑动平均结果
        var_.append(sess.run(ema_average_op)) #读取数据
        

plt.plot(sin_x,sin_y,label = 'sin(x)')
plt.plot(sin_x,var_, label = 'moving_sin(x)')
plt.legend()
plt.show()

实验结果

滑动平均模型仿真_ ExponentailMovingAverage

结果分析:

滑动平均模型减弱的震荡,初始时衰减系数比较小,状态可以快速适应新变量,随着衰减系数的增大,状态逐渐稳定在平均值

 

相关文章: