tensorflow学习笔记(三十三):ExponentialMovingAverage

ExponentialMovingAverage

Some training algorithms, such as GradientDescent and Momentum often benefit from maintaining a moving average of variables during optimization. Using the moving averages for evaluations often improve results significantly. tensorflow 官网上对于这个方法功能的介绍。GradientDescentMomentum 方式的训练 都能够从 ExponentialMovingAverage 方法中获益。

什么是MovingAverage? 假设我们与一串时间序列

那么,这串时间序列的 MovingAverage 就是:

这是一个递归表达式。 如何理解这个式子呢? 他就像一个滑动窗口,mvtmv_t 的值只和这个窗口内的 aia_i 有关, 为什么这么说呢?将递归式拆开 :

得到:

当 t-i>C, CC 为某足够大的数时

, 所以:

。即, mv_t 的值只和

有关。

tensorflow 中的 ExponentialMovingAverage

这时,再看官方文档中的公式:

,就知道各代表什么意思了。 shadow variables are created with trainable=False。用其来存放 ema 的值

import tensorflow as tf
w = tf.Variable(1.0)
ema = tf.train.ExponentialMovingAverage(0.9)
update = tf.assign_add(w, 1.0)

with tf.control_dependencies([update]):
    #返回一个op,这个op用来更新moving_average,i.e. shadow value
    ema_op = ema.apply([w])#这句和下面那句不能调换顺序
# 以 w 当作 key, 获取 shadow value 的值
ema_val = ema.average(w)#参数不能是list,有点蛋疼

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    for i in range(3):
        sess.run(ema_op)
        print(sess.run(ema_val))
# 创建一个时间序列 1 2 3 4
#输出:
#1.1      =0.9*1 + 0.1*2
#1.29     =0.9*1.1+0.1*3
#1.561    =0.9*1.29+0.1*4

你可能会奇怪,明明 只执行三次循环, 为什么产生了 4 个数? 这是因为,当程序执行到 ema_op = ema.apply([w]) 的时候,如果 wVariable, 那么将会用 w 的初始值初始化 ema 中关于 wema_value,所以

。如果 wTensor的话,将会用 0.0 初始化。

官网中的示例:

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...
...
# Create an op that applies the optimizer.  This is what we usually
# would use as a training op.
opt_op = opt.minimize(my_loss, [var0, var1])

# Create an ExponentialMovingAverage object
ema = tf.train.ExponentialMovingAverage(decay=0.9999)

# Create the shadow variables, and add ops to maintain moving averages
# of var0 and var1.
maintain_averages_op = ema.apply([var0, var1])

# Create an op that will update the moving averages after each training
# step.  This is what we will use in place of the usual training op.
with tf.control_dependencies([opt_op]):
    training_op = tf.group(maintain_averages_op)
    # run这个op获取当前时刻 ema_value
    get_var0_average_op = ema.average(var0)

使用 ExponentialMovingAveraged parameters

假设我们使用了ExponentialMovingAverage方法训练了神经网络, 在test阶段,如何使用 ExponentialMovingAveraged parameters呢? 官网也给出了答案 方法一:

# Create a Saver that loads variables from their saved shadow values.
shadow_var0_name = ema.average_name(var0)
shadow_var1_name = ema.average_name(var1)
saver = tf.train.Saver({shadow_var0_name: var0, shadow_var1_name: var1})
saver.restore(...checkpoint filename...)
# var0 and var1 now hold the moving average values

方法二:

#Returns a map of names to Variables to restore.
variables_to_restore = ema.variables_to_restore()
saver = tf.train.Saver(variables_to_restore)
...
saver.restore(...checkpoint filename...)

这里要注意的一个问题是,用于保存的saver可不能这么写,参考 http://blog.csdn.net/u012436149/article/details/56665612

参考资料

https://www.tensorflow.org/versions/master/api_docs/python/train/moving_averages

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HansBug's Lab

3172: [Tjoi2013]单词

3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1424  Solved...

3557
来自专栏逍遥剑客的游戏开发

Nebula3中的模型

1147
来自专栏极客猴

Django 学习笔记之模型高级用法(下)

除了抽象模型,在模型中定义的字段都会成为表中的列。如果我们需要给模型指定其他一些信息,例如排序方式、数据库表名等,就需要用到 Meta。Meta 是一个可选的类...

752
来自专栏数据结构与算法

洛谷P3707 [SDOI2017]相关分析(线段树)

题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度、颜色等等,进而估算出星星的距离,半径等等。 Frank不仅喜欢观测...

2815
来自专栏程序员叨叨叨

7.2 uniform

Cg 语言将输入数据流分为两类(参见文献[3]Program inputs and Outputs ):

474
来自专栏点滴积累

使用bokeh-scala进行数据可视化(2)

目录 前言 几种高级可视化图表 总结 一、前言        之前已经简单介绍过一次如何使用Bokeh-scala进行数据可视化(见使用bokeh-scala进...

3387
来自专栏机器学习原理

我的机器学习matplotlib篇导入画出第一个图形颜色,标记,线型刻度、标题、标签和图例!创建子图

前言: matplotlib是python最常用的绘图库,能帮你画出美丽的各种图 导入 包含了中文显示,屏外显示 import matplotlib.p...

3726
来自专栏灯塔大数据

技术 | Python从零开始系列连载(二十五)

为了解答大家学习Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极学习转载~

622
来自专栏祝威廉

利用PySpark 数据预处理(特征化)实战

之前说要自己维护一个spark deep learning的分支,加快SDL的进度,这次终于提供了一些组件和实践,可以很大简化数据的预处理。

553
来自专栏CNN

Android OpenGL显示任意3D模型文件

转载请注明出处:【huachao1001的专栏:http://blog.csdn.net/huachao1001】

1014

扫码关注云+社区