动量方法原理(参考神经网络设计)
tensorflow中的滑动平均使用
实验过程:
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()
实验结果
结果分析:
滑动平均模型减弱的震荡,初始时衰减系数比较小,状态可以快速适应新变量,随着衰减系数的增大,状态逐渐稳定在平均值