关于tf.train.ExponentialMovingAverage使用的详细解析
时间:2022-07-25
本文章向大家介绍关于tf.train.ExponentialMovingAverage使用的详细解析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
交流、咨询,有疑问欢迎添加QQ 2125364717,一起交流、一起发现问题、一起进步啊,哈哈哈哈哈
tf.train.ExponentialMovingAverage是指数加权平均的求法,具体的公式是 total=a*total+(1-a)*next,
下面讲起具体的使用方式:
- ema = tf.train.ExponentialMovingAverage(0.9) 0.9:就是其衰减因子。
- total=ema.apply([next1,next2,nex3...]),这里的传入的参数是一个变量列表,可以同时计算多个加权平均数。
- total1=a*total1+(1-a)*next1, total2=a*total2+(1-a)*next2,可以取出相应的值total1=ema.average(next1),这一步只是取值,不是计算,上一步如果sess.run(total)便开始计算。
具体的执行方式开始debug看源码,以下讲一下具体的应用以及指数加权平均的初始值的问题:
import tensorflow as tf
w1 = tf.Variable(1.0)
w2 = tf.Variable(2.0)
w3 = tf.Variable(2.0)
w4 = tf.Variable(2.0)
ema = tf.train.ExponentialMovingAverage(0.9)
update=tf.assign_add(w1,1.0)
ema_op = ema.apply([w1,w2,w3,w4])
init=tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for i in range(3):
sess.run(ema_op)
for i in [w1,w2,w3,w4]:
print(sess.run(ema.average(i)))
sess.run(update)
执行的结果:
#第一次执行:ema.apply
1.0
2.0
2.0
2.0
#第二次执行:ema.apply
1.1
2.0
2.0
2.0
#第三次执行:ema.apply
1.2900001
2.0
2.0
可以发现只要你的next不更新,那么使用都是一个数据,也就是你的原始初始化数据,只有当你的数据更新,形成一个序列才会
逐步计算其指数加权平均。
2:需要注意的地方:
with tf.Session() as sess:
sess.run(init)
for i in range(3):
sess.run(ema_op)
for i in [w1,w2,w3,w4]:
print(sess.run(ema.average(i)))
sess.run(update)
其结果是:
1.0
2.0
2.0
2.0
1.1
2.0
2.0
2.0
1.2900001
2.0
2.0
2.0
如果变成:
with tf.Session() as sess:
sess.run(init)
for i in range(3):
sess.run(update)
sess.run(ema_op)
for i in [w1,w2,w3,w4]:
print(sess.run(ema.average(i)))
sess.run(update)
结果是:
1.1
2.0
2.0
2.0
1.2900001
2.0
2.0
2.0
1.5610001
2.0
2.0
2.0
1.1=1*0.9+2*0.1
3:如果将w1换成update,代码如下:
w1 = tf.Variable(1.0)
w2 = tf.Variable(2.0)
w3 = tf.Variable(2.0)
w4 = tf.Variable(2.0)
ema = tf.train.ExponentialMovingAverage(0.9)
update=tf.assign_add(w1,1.0)
ema_op = ema.apply([update,w2,w3,w4])#这句和下面那句不能调换顺序
init=tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for i in range(3):
sess.run(ema_op)
for i in [update,w2,w3,w4]:
print(sess.run(ema.average(i)))
结果如下:
0.20000005
2.0
2.0
2.0
0.4800001
2.0
2.0
2.0
0.8320002
2.0
2.0
2.0
0.2=0.9*0+0.1*2
这就是就是加权平均的使用方式需要注意的是:
- appy方法中应用的是哪个张量,其初值是多少。
- 每次appy时,张量是否改变,是否形成一个序列。
- 当在apply前是否对张量改变,如果改变在之前的是total 之后的值是next,再apply计算下一个total。
- 如果apply里面的张量是由其他op计算而来的,那么其之前的total为0,next就是这个张量 total=0*0.9+next*0.1。
各位看官老爷,如果觉得对您有用麻烦赏个子,创作不易,0.1元就行了。下面是微信乞讨码:
添加描述
添加描述
- Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】
- 撞库扫号防范
- 分享一个 HTTPS A+ 的 nginx 配置
- Vijos P1785 同学排序【模拟】
- Vijos P1784 数字统计【模拟】
- 网络安全黑暗森林法则:2015 ISC 深度回顾
- Codeforces 626G Raffles(贪心+线段树)
- window.opener.location 安全风险讨论
- Vijos P1497 立体图【模拟】
- Vijos P1127 级数求和【模拟】
- 新型漏洞:利用浏览器Cookie绕过HTTPS并窃取私人信息
- Vijos P1113 不高兴的津津【模拟】
- Linux下MySQL的彻底卸载和安装配置字符集
- Codeforces 626F Group Projects(滚动数组+差分dp)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 设计模式之行为型模式
- 设计模式之结构型模式
- 设计模式之建造者模式与原型模式
- 设计模式之工厂模式
- Solr在分布式环境中的应用
- Docker基础与实战,看这一篇就够了
- org.springframework.beans.factory.NoSuchBeanDefinitionException:
- Vector 源码剖析
- java.util.concurrent.TimeoutException: 的解决!
- HTTP Status 503 - Server is shutting down or failed to initialize
- LinkedHashMap 源码剖析
- 基于SSM框架与Maven的CRUD案例
- Java 8的这个新特性,你用了吗?
- JSP+Servlet项目整合
- springboot 整合 Mybatis、JPA、Redis