首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >tensorflow学习笔记(三十三):ExponentialMovingAverage

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

作者头像
ke1th
发布于 2018-01-02 04:22:44
发布于 2018-01-02 04:22:44
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

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 的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 初始化。

官网中的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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呢? 官网也给出了答案 方法一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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

方法二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
tensorflow学习笔记(四十一):control dependencies
本文介绍了tensorflow控制依赖的两种方式,分别是tf.control_dependencies和tf.assign。同时,本文还介绍了两种不适用于tf.control_dependencies的情况,分别是使用变量初始值作为控制依赖以及在一个Session中同时使用多个控制依赖。
ke1th
2018/01/02
2.1K0
卷积神经网络处理图像识别(三)
下面是测试Batch的总Loss和验证集上的准确率的收敛趋势图。由于我的电脑性能不好,所以我大幅度削减了待训练参数个数。尽管如此,2000轮训练之后,在验证集上5000个图片的预测正确率已达98.3%。如若不削减参数,准确率可达99.4%。
用户6021899
2019/11/25
9060
卷积神经网络处理图像识别(三)
关于tf.train.ExponentialMovingAverage使用的详细解析
tf.train.ExponentialMovingAverage是指数加权平均的求法,具体的公式是 total=a*total+(1-a)*next,
狼啸风云
2020/09/24
1.5K0
TensorFlow指南(三)——深度神经网络(初级)
由于本系列博文主要专注于Tensorflow本身,所以还是老样子不会过多讲解神经网络的理论知识。 可以参阅这篇博文来先理解下神经网络:http://blog.csdn.net/u011239443/article/details/76680704
小爷毛毛_卓寿杰
2019/02/13
4420
Tensortflow学习笔记
w=tf.Variable(tf.random_normal(2,3,stddev=2, mean=0, seed=1))
freesan44
2021/10/12
5220
TensorFlow-手写数字识别(三)
本篇文章在上篇TensorFlow-手写数字识别(二)的基础上,将全连接网络改为LeNet-5卷积神经网络,实现手写数字识别。
xxpcb
2020/08/04
1K0
Tensorflow滑动平均模型
移动平均法是用一组最近的实际数据值来预测未来一期或几期内公司产品的需求量、公司产能等的一种常用方法。移动平均法适用于即期预测。当产品需求既不快速增长也不快速下降,且不存在季节性因素时,移动平均法能有效地消除预测中的随机波动,是非常有用的。移动平均法根据预测时使用的各元素的权重不同
演化计算与人工智能
2020/08/14
1.5K0
Tensorflow滑动平均模型
tensorflow实现手写体数字识别
之前在人工智能课上自己手动搭建过一个BP神经网络实现MNIST数据集的手写体数字识别,使用的是c++,最终准确率的上限在95%至96%左右(毕竟水平有限)。这次不一样了,使用tensorflow进行实验,准确率确实提高了不少。可能有人会觉得tensorflow有点过时,现在的大企业不怎么用tensorflow了,但我觉得,对于初学者来说,tensorflow还是不错的选择。
luxuantao
2021/02/24
1.2K0
持久化的基于 L2 正则化和平均滑动模型的 MNIST 手写数字识别模型
[1]Tensorflow实战Google深度学习框架: https://github.com/caicloud/tensorflow-tutorial/tree/master/Deep_Learning_with_TensorFlow/1.4.0
演化计算与人工智能
2020/08/14
4480
tensorflow的模型持久化
tensorflow提供了一个非常简单的API来保存和还原一个神经网络模型。这个API就是tf.train.Saver类。以下代码给出了保存tensorflow计算图的方法。
狼啸风云
2019/03/06
2K0
tf24: GANs—生成明星脸
本文介绍了如何使用TensorFlow实现生成对抗网络(GANs),用于生成明星脸。首先,介绍了TensorFlow的基本概念,然后详细阐述了如何搭建一个GANs模型。接着,展示了如何训练模型以及使用GANs进行图像生成。最后,总结了本文的主要内容和实现步骤。
MachineLP
2018/01/09
1.2K0
tf24: GANs—生成明星脸
EMA算法及其tensorflow实现
滑动平均模型可以使模型在测试数据上更健壮(robust)的方法------滑动平均模型。在采用随机梯度下降算法训练神经网络时,使用滑动平均模型在很多应用中都可以在一定程度提高最终模型在测试数据上的表现。
狼啸风云
2019/08/18
1.4K0
TensorFlow中滑动平均模型介绍
其中a的取值范围[0,1],具体就是:本次滤波结果=(1-a)*本次采样值+a*上次滤波结果,采用此算法的目的是:
老潘
2018/06/21
1.7K0
TensorFlow中滑动平均模型介绍
DSSM & Multi-view DSSM TensorFlow实现
Learning Deep Structured Semantic Models for Web Search using Clickthrough Data以及其后续文章
百川AI
2021/10/19
1.1K0
基于tensorflow的MNIST数字识别
MNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会作为深度学习的入门样例。下面大致介绍这个数据集的基本情况,并介绍temsorflow对MNIST数据集做的封装。tensorflow的封装让使用MNIST数据集变得更加方便。MNIST数据集是NIST数据集的一个子集,它包含了60000张图片作为训练数据,10000张图片作为测试数据。在MNIST数据集中的每一张图片都代表了0~9中的一个数字。图片的大小都为28*28,且数字都会出现在图片的正中间。
狼啸风云
2019/03/01
3.1K0
TensorFlow-CIFAR10 CNN代码分析
想了解更多信息请参考CIFAR-10 page,以及Alex Krizhevsky写的技术报告
百川AI
2021/10/19
7100
TensorFlow-实战Google深度学习框架 笔记(上)
TensorFlow 是一种采用数据流图(data flow graphs),用于数值计算的开源软件库。在 Tensorflow 中,所有不同的变量和运算都是储存在计算图,所以在我们构建完模型所需要的图之后,还需要打开一个会话(Session)来运行整个计算图 通常使用import tensorflow as tf来载入TensorFlow 在TensorFlow程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图。除了使用默认的计算图,可以使用tf.Graph函数来生成新的计算图,不同计算图上的张量和运算不会共享 在TensorFlow程序中,所有数据都通过张量的形式表示,张量可以简单的理解为多维数组,而张量在TensorFlow中的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。即在张量中没有真正保存数字,而是如何得到这些数字的计算过程 如果对变量进行赋值的时候不指定类型,TensorFlow会给出默认的类型,同时在进行运算的时候,不会进行自动类型转换 会话(session)拥有并管理TensorFlow程序运行时的所有资源,所有计算完成之后需要关闭会话来帮助系统回收资源,否则可能会出现资源泄漏问题 一个简单的计算过程:
范中豪
2019/09/10
6870
TensorFlow-实战Google深度学习框架 笔记(上)
如何用tensorflow优化神经网络
梯度下降算法主要用户优化单个参数的取值,而反向传播算法给出了一个高效的方式在所有参数上使用梯度下降算法,从而使神经网络模型在训练数据上的损失函数尽可能小。反向传播算法是训练神经网络的核心算法,他可以根据定义好的损失函数优化神经网络中参数的取值,从而使神经网络在训练数据集上的损失函数达到一个最小值。神经网络模型中参数的优化过程直接决定了模型的质量,是使用神经网络时非常重要的一步。
狼啸风云
2019/01/18
1.1K0
10分钟详解EMA(滑动平均)并解决EMA下ckpt权重与pb权重表现不一问题
今天用YunYang的evaluate.py评估模型的时候,意外发现用同样的ckpt权重文件转换而成的pb文件效果不一样,使用ckpt的效果非常差,仔细研究后才发现是滑动平均(EMA)搞的鬼,于是便重新重温了一下EMA。 目录 EMA定义 EMA原理理解 ckpt和pb保存不同的原因 参考 EMA定义与原理 EMA(ExponentialMovingAverage),也就是我们常说的滑动平均模型,一般在采用SGD(随机梯度下降)训练的时候,都会用他来提高我们在测试数据的表现,我们从[1]结合tensorfl
CristianoC
2020/06/02
3K0
Tensorflow 实战笔记
tf.Variable(tf.random_normal([2,3],stddev=2)) 通过满足正态分布的随机数来初始化神经网络中的参数是一个常用方法。
微风、掠过
2018/10/09
5200
Tensorflow 实战笔记
相关推荐
tensorflow学习笔记(四十一):control dependencies
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档