近来看batch normalization的代码时,遇到tf.train.ExponentialMovingAverage()函数,特此记录。

tf.train.ExponentialMovingAverage()函数实现滑动平均模型和计算变量的移动平均值。

TensorFlow官网上对于这个方法的介绍:

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.

一些训练算法,如梯度下降(GradientDescent)和动量(Momentum),经常受益于在优化过程中保持变量的移动平均。使用移动平均线进行评估通常会显著改善结果。

# 类,用于计算滑动平均
tf.train.ExponentialMovingAverage __init__(
decay,
num_updates=None,
zero_debias=False,
name='ExponentialMovingAverage')

decay是衰减率。在创建ExponentialMovingAverage对象时,需要指定衰减率(decay),用于控制模型的更新速度。影子变量的初始值与训练变量的初始值相同。当运行变量更新时,每个影子变量都会更新为:

  shadowvariable=decay∗shadowvariable+(1−decay)∗variable

num_updates是ExponentialMovingAverage提供用来动态设置decay的参数,当初始化时,函数提供了num_updates参数,即不为none时,每次的衰减率是:

apply()方法添加了训练变量的影子副本,并保持了其影子副本中训练变量的移动平均值操作。在每次训练之后调用此操作,更新移动平均值。average()和average_name()方法可以获取影子变量及其名称。

decay设置为接近1的值比较合理,通常为:0.999,0.9999等,decay越大模型越稳定,因为decay越大,参数更新的速度就越慢,趋于稳定。

官网中的示例:

# 创建variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... 使用variables去创建一个训练模型...
...
# 创建一个使用the optimizer对的op.
# 这是我们通常会使用作为一个training op.
opt_op = opt.minimize(my_loss, [var0, var1]) # 创建一个ExponentialMovingAverage object
ema = tf.train.ExponentialMovingAverage(decay=0.9999) # 创建the shadow variables,然后把ops加到maintain moving averages of var0 and var1.
maintain_averages_op = ema.apply([var0, var1]) # 创建一个op,在每次训练之后用来更新the moving averages.
# 用来代替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)

例子:

import tensorflow as tf
import numpy as np v1 = tf.Variable(0, dtype=tf.float32)
step = tf.Variable(tf.constant(0)) ema = tf.train.ExponentialMovingAverage(0.99, step)
maintain_average = ema.apply([v1]) with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print(sess.run([v1, ema.average(v1)])) #初始的值都为0 sess.run(tf.assign(v1, 5)) #把v1变为5
sess.run(maintain_average)
print(sess.run([v1, ema.average(v1)]))
# decay=min(0.99, 1/10)=0.1, v1=0.1*0+0.9*5=4.5 sess.run(tf.assign(step, 10000)) # steps=10000
sess.run(tf.assign(v1, 10)) # v1=10
sess.run(maintain_average)
print(sess.run([v1, ema.average(v1)]))
# decay=min(0.99,(1+10000)/(10+10000))=0.99, v1=0.99*4.5+0.01*10=4.555 sess.run(maintain_average)
print(sess.run([v1, ema.average(v1)]))
# decay=min(0.99,(1+10000)/(10+10000))=0.99, v1=0.99*4.555+0.01*10=4.60945
> [0.0, 0.0]
> [5.0, 4.5]
> [10.0, 4.555]
> [10.0, 4.60945]

每次更新完之后,影子变量(shadow_variable)的值就会更新,varible的值就是我们设定的值。如果在下一次运行这个函数的时候我们不再指定新的值,那varible的值就不变,影子变量更新。如果指定varible的值,那variable就改变为对应的指定值,相应的影子变量也改变。
原文链接:https://blog.csdn.net/tefuirnever/article/details/88902132

deep_learning_Function_tf.train.ExponentialMovingAverage()滑动平均的更多相关文章

  1. tensorflow 下的滑动平均模型 —— tf.train.ExponentialMovingAverage

    在采用随机梯度下降算法训练神经网络时,使用 tf.train.ExponentialMovingAverage 滑动平均操作的意义在于提高模型在测试数据上的健壮性(robustness). tenso ...

  2. Tensorflow滑动平均模型tf.train.ExponentialMovingAverage解析

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 移动平均法相关知识 移动平均法又称滑动平均法.滑动平均模型法(Moving average,MA) 什么是移动平均法 移动平均法是用一组最近的实 ...

  3. 理解滑动平均(exponential moving average)

    1. 用滑动平均估计局部均值 滑动平均(exponential moving average),或者叫做指数加权平均(exponentially weighted moving average),可以 ...

  4. 『TensorFlow』滑动平均

    滑动平均会为目标变量维护一个影子变量,影子变量不影响原变量的更新维护,但是在测试或者实际预测过程中(非训练时),使用影子变量代替原变量. 1.滑动平均求解对象初始化 ema = tf.train.Ex ...

  5. tensorflow随机梯度下降算法使用滑动平均模型

    在采用随机梯度下降算法训练神经网络时,使用滑动平均模型可以提高最终模型在测试集数据上的表现.在Tensflow中提供了tf.train.ExponentialMovingAverage来实现滑动平均模 ...

  6. tensorflow入门笔记(二) 滑动平均模型

    tensorflow提供的tf.train.ExponentialMovingAverage 类利用指数衰减维持变量的滑动平均. 当训练模型的时候,保持训练参数的滑动平均是非常有益的.评估时使用取平均 ...

  7. tensorflow笔记之滑动平均模型

    tensorflow使用tf.train.ExponentialMovingAverage实现滑动平均模型,在使用随机梯度下降方法训练神经网络时候,使用这个模型可以增强模型的鲁棒性(robust),可 ...

  8. TensorFlow+实战Google深度学习框架学习笔记(11)-----Mnist识别【采用滑动平均,双层神经网络】

    模型:双层神经网络 [一层隐藏层.一层输出层]隐藏层输出用relu函数,输出层输出用softmax函数 过程: 设置参数 滑动平均的辅助函数 训练函数 x,y的占位,w1,b1,w2,b2的初始化 前 ...

  9. (转)理解滑动平均(exponential moving average)

    转自:理解滑动平均(exponential moving average) 1. 用滑动平均估计局部均值 滑动平均(exponential moving average),或者叫做指数加权平均(exp ...

随机推荐

  1. NavMenu 导航菜单

    顶栏 适用广泛的基础用法. 导航菜单默认为垂直模式,通过mode属性可以使导航菜单变更为水平模式.另外,在菜单中通过submenu组件可以生成二级菜单.Menu 还提供了background-colo ...

  2. mips调试

    0x01 环境搭建 由于我们通常的操作系统指令集都是x86的,所以无法跑MIPS程序.这时候就需要装QEMU来模拟,QEMU通过源码编译较为复杂,我们又没有特殊的需求,所以直接使用ubuntu的APT ...

  3. APP营销软件项目常见(合规)风险评估

    一个软件项目开始前,往往需要先进行风险评估以及可行性评估,尤其涉及到营销拉新类项目,需要大量依靠用户二次分享传播,为了避免项目做了无用功,分享一些常见的App项目风险: 微信分享功能 风险: 1.蒙层 ...

  4. 抓包工具chlers的使用

    1,下载chlers破解版:https://zhubangbang.com/charles-crack-version-free-download-and-install-tutorial.html ...

  5. 从 ssh private key 中重新生成 public key

    Use the -y option to ssh-keygen: ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub From the 'man ...

  6. java:面向对象(多态,final,抽象方法,(简单工厂模式即静态方法模式),接口)

    * 生活中的多态:同一种物质,因环境不同而表现不同的形态. * 程序中多态:同一个"接口",因不同的实现而执行不同的操作. * 多态和方法的重写经常结合使用,子类重写父类的方法,将 ...

  7. 【HANA系列】SAP HANA SQL计算某日期是当年的第几天

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL计算某日 ...

  8. 【linux杂谈】centos6和centos7中固定IP的方法

    众所周知,一大部分集合部署的应用服务器内网相互通信都是采用固定IP.在阿里云.腾讯云上申请的云服务器也是固定IP,这就意味着在云平台内部策略划拨肯定是也固定了IP(即便不是采取直接在系统内固定的方式) ...

  9. python 爬虫 urllib模块 url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦’的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

  10. 第四周课程总结&实验报告(二)

    Java实验报告(二) 实验二 Java简单类与对象 一. 实验目的 (1) 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: (2) 理解类和对象的区别,掌握构造 ...