TensorFlow 滑动平均的示例代码


Posted in Python onJune 19, 2018

滑动平均会为目标变量维护一个影子变量,影子变量不影响原变量的更新维护,但是在测试或者实际预测过程中(非训练时),使用影子变量代替原变量。

1、滑动平均求解对象初始化

ema = tf.train.ExponentialMovingAverage(decay,num_updates)

参数decay

`shadow_variable = decay * shadow_variable + (1 - decay) * variable`

参数num_updates

`min(decay, (1 + num_updates) / (10 + num_updates))`

2、添加/更新变量

添加目标变量,为之维护影子变量

注意维护不是自动的,需要每轮训练中运行此句,所以一般都会使用tf.control_dependencies使之和train_op绑定,以至于每次train_op都会更新影子变量

ema.apply([var0, var1])

3、获取影子变量值

这一步不需要定义图中,从影子变量集合中提取目标值

sess.run(ema.average([var0, var1]))

4、保存&载入影子变量

我们知道,在TensorFlow中,变量的滑动平均值都是由影子变量所维护的,如果你想要获取变量的滑动平均值需要获取的是影子变量而不是变量本身。

保存影子变量

建立tf.train.ExponentialMovingAverage对象后,Saver正常保存就会存入影子变量,命名规则是"v/ExponentialMovingAverage"对应变量”v“

import tensorflow as tf 
if __name__ == "__main__": 

  v = tf.Variable(0.,name="v") 

  #设置滑动平均模型的系数 

  ema = tf.train.ExponentialMovingAverage(0.99) 

  #设置变量v使用滑动平均模型,tf.all_variables()设置所有变量 

  op = ema.apply([v]) 

  #获取变量v的名字 

  print(v.name) 

  #v:0 

  #创建一个保存模型的对象 

  save = tf.train.Saver() 

  sess = tf.Session() 

  #初始化所有变量 

  init = tf.initialize_all_variables() 

  sess.run(init) 

  #给变量v重新赋值 

  sess.run(tf.assign(v,10)) 

  #应用平均滑动设置 

  sess.run(op) 

  #保存模型文件 

  save.save(sess,"./model.ckpt") 

  #输出变量v之前的值和使用滑动平均模型之后的值 

  print(sess.run([v,ema.average(v)])) 

  #[10.0, 0.099999905]

载入影子变量并映射到变量

利用了Saver载入模型的变量名映射功能,实际上对所有的变量都可以如此操作『TensorFlow』模型载入方法汇总

v = tf.Variable(1.,name="v") 

#定义模型对象 

saver = tf.train.Saver({"v/ExponentialMovingAverage":v}) 

sess = tf.Session() 

saver.restore(sess,"./model.ckpt") 

print(sess.run(v)) 

#0.0999999

这里特别需要注意的一个地方就是,在使用tf.train.Saver函数中,所传递的模型参数是{"v/ExponentialMovingAverage":v}而不是{"v":v},如果你使用的是后面的参数,那么你得到的结果将是10而不是0.09,那是因为后者获取的是变量本身而不是影子变量。

使用这种方式来读取模型文件的时候,还需要输入一大串的变量名称。

variables_to_restore函数的使用

v = tf.Variable(1.,name="v") 

#滑动模型的参数的大小并不会影响v的值 

ema = tf.train.ExponentialMovingAverage(0.99) 

print(ema.variables_to_restore()) 

#{'v/ExponentialMovingAverage': <tf.Variable 'v:0' shape=() dtype=float32_ref>} 

sess = tf.Session() 

saver = tf.train.Saver(ema.variables_to_restore()) 

saver.restore(sess,"./model.ckpt") 

print(sess.run(v)) 

#0.0999999

variables_to_restore会识别网络中的变量,并自动生成影子变量名。

通过使用variables_to_restore函数,可以使在加载模型的时候将影子变量直接映射到变量的本身,所以我们在获取变量的滑动平均值的时候只需要获取到变量的本身值而不需要去获取影子变量。

5、官方文档例子

官方文档中将每次apply更新就会自动训练一边模型,实际上可以反过来两者关系,《tf实战google》P128中有示例

| Example usage when creating a training model:
 | 
 | ```python
 | # 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)
 | 
 | with tf.control_dependencies([opt_op]):
 |   # Create the shadow variables, and add ops to maintain moving averages
 |   # of var0 and var1. This also creates 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.
 |   training_op = ema.apply([var0, var1])
 | 
 | ...train the model by running training_op...
 | ```

6、batch_normal的例子

和上面不太一样的是,batch_normal中不太容易绑定到train_op(位于函数体外面),则强行将两个variable的输出过程化为节点,绑定给参数更新步骤

def batch_norm(x,beta,gamma,phase_train,scope='bn',decay=0.9,eps=1e-5):

  with tf.variable_scope(scope):

    # beta = tf.get_variable(name='beta', shape=[n_out], initializer=tf.constant_initializer(0.0), trainable=True)

    # gamma = tf.get_variable(name='gamma', shape=[n_out],

    #             initializer=tf.random_normal_initializer(1.0, stddev), trainable=True)

    batch_mean,batch_var = tf.nn.moments(x,[0,1,2],name='moments')

    ema = tf.train.ExponentialMovingAverage(decay=decay)

 

    def mean_var_with_update():

      ema_apply_op = ema.apply([batch_mean,batch_var])

      with tf.control_dependencies([ema_apply_op]):

        return tf.identity(batch_mean),tf.identity(batch_var)

        # identity之后会把Variable转换为Tensor并入图中,

        # 否则由于Variable是独立于Session的,不会被图控制control_dependencies限制

 

    mean,var = tf.cond(phase_train,

              mean_var_with_update,

              lambda: (ema.average(batch_mean),ema.average(batch_var)))

   normed = tf.nn.batch_normalization(x, mean, var, beta, gamma, eps)

  return normed

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
查看Python安装路径以及安装包路径小技巧
Apr 28 Python
python实现的AES双向对称加密解密与用法分析
May 02 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
python批量查询、汉字去重处理CSV文件
May 31 Python
python实现flappy bird小游戏
Dec 24 Python
Python socket连接中的粘包、精确传输问题实例分析
Mar 24 Python
Python接口测试数据库封装实现原理
May 09 Python
Python使用Excel将数据写入多个sheet
May 16 Python
python反扒机制的5种解决方法
Feb 06 Python
python 如何获取页面所有a标签下href的值
May 06 Python
python3个性签名设计实现代码
Jun 19 #Python
TensorFlow 模型载入方法汇总(小结)
Jun 19 #Python
python3爬虫之设计签名小程序
Jun 19 #Python
Python GUI Tkinter简单实现个性签名设计
Jun 19 #Python
TensorFlow数据输入的方法示例
Jun 19 #Python
深入分析python中整型不会溢出问题
Jun 18 #Python
Python登录注册验证功能实现
Jun 18 #Python
You might like
15种PHP Encoder的比较
2007/04/17 PHP
PHP中对缓冲区的控制实现代码
2013/09/29 PHP
php中namespace use用法实例分析
2016/01/22 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
vue2.0 datepicker使用方法
2018/02/04 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
Python制作词云图代码实例
2019/09/09 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
在python tkinter界面中添加按钮的实例
2020/03/04 Python
您的网上新华书店:文轩网
2016/08/24 全球购物
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
市场调研项目授权委托书范本
2014/10/04 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
大学副班长竞选稿
2015/11/21 职场文书