day-18 滑动平均模型测试样例
为了使训练模型在测试数据上有更好的效果,可以引入一种新的方法:滑动平均模型。通过维护一个影子变量,来代替最终训练参数,进行训练模型的验证。
在tensorflow中提供了ExponentialMovingAverage来实行滑动平均模型,模型会维护一个影子变量,其计算公式为:
shadow_variable = decay * shadow_variable + (1 - decay) * variable
当训练模型时,维护训练参数的滑动平均值是有好处的。相比较最终训练值,验证时使用滑动平均值有时能产生更好的结果。
apply()函数方法会添加一个影子拷贝到训练变量中,然后在他们影子副本上维护训练参数的滑动平均值计算操作。这个操作通常在一轮训练完之后进行。
average()和average_name()函数提供了访问影子变量和他们名字的方法。这在构建一个评估模型或者从checkpoint文件中重载模型时非常有用。在验证时,可以帮助使用滑动平均值替换最后训练值。要使用这个模型,需要有3个步骤:
1、 创建一个滑动平均模型对象
step = tf.Variable(initial_value=0,dtype=tf.float32,trainable=False)
ema = tf.train.ExponentialMovingAverage(decay=0.99,num_updates=step)
decay就是前面公式里面的衰减因此,合理的decay值可以是接近1.0,例如0.999,0.9999等多个9中变换。num_updates为一个可选的参数,decay值由如下公式决定:
min(decay, (1 + num_updates) / (10 + num_updates))。目的是使影子变量在刚开始训练的时候,更新的更快。 因此num_updates通常可以传入一个递增的训练步数变量。
2、 加入训练参数列表到模型中进行维护
新建两个训练参数,并将其加入滑动平均模型对象中维护,apply()函数接受一个参数列表。
var0 = tf.Variable(initial_value=0,dtype=tf.float32,trainable=False)
var1 = tf.Variable(initial_value=0,dtype=tf.float32,trainable=False)
maintain_averages_op = ema.apply([var0,var1])
3、 训练完成以后,更新滑动平均模型中各个影子变量的值
sess.run(maintain_averages_op)
print(sess.run([var0,ema.average(var0),var1,ema.average(var1)])) # 输出[10,4.555,10,9.01]
完整的滑动平均模型测试样例如下:
# 导入tensorflow库
import tensorflow as tf # 创建一个滑动平均模型对象
step = tf.Variable(initial_value=0,dtype=tf.float32,trainable=False)
ema = tf.train.ExponentialMovingAverage(decay=0.99,num_updates=step) # 创建两个训练参数,并将其加入滑动平均模型对象中,对象会为这两个训练参数创建两个影子变量
# 影子变量shadow_variable = decay * shadow_variable + (1 - decay) * variable
# 如果滑动平均模型对象创建时,指定了num_updates,则decay = min{decay,(1 + num_updates)/(10 + num_updates)}
var0 = tf.Variable(initial_value=0,dtype=tf.float32,trainable=False)
var1 = tf.Variable(initial_value=0,dtype=tf.float32,trainable=False)
maintain_averages_op = ema.apply([var0,var1]) # 测试更新影子变量值
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init) # 第一次初始滑动平均
sess.run(maintain_averages_op)
# decay = min(0.99,0.1) = 0.1
# 初始时:
# shadow_variable_var0 = var0 = 0
# shadow_variable_var1 = var1 = 0
print(sess.run([var0,ema.average(var0),var1,ema.average(var1)])) # 第二次更新滑动平均
sess.run(tf.assign(var0,5.0))
sess.run(tf.assign(var1, 10.0))
# decay = min(0.99,(1+0)/(10+0)) = 0.1
# shadow_variable_var0 = decay * shadow_variable + (1 - decay) * variable = 0.1*0 + (1-0.1)*5 = 4.5
# shadow_variable_var1 = 9.0
sess.run(maintain_averages_op)
print(sess.run([var0,ema.average(var0),var1,ema.average(var1)])) # 输出[5.0,4.5,10,9.0] # 第三次更新滑动平均
sess.run(tf.assign(step,10000))
sess.run(tf.assign(var0,10))
# decay = min(0.99,(1+10000)/(10+10000)) = 0.99
# shadow_variable_var0 = decay * shadow_variable + (1 - decay) * variable = 0.99*4.5 + (1-0.99)*10 = 4.555
# shadow_variable_var1 = 0.99*9.0+(1-0.99)*10 = 9.01
sess.run(maintain_averages_op)
print(sess.run([var0,ema.average(var0),var1,ema.average(var1)])) # 输出[10,4.555,10,9.01] # 第四次更新滑动平均
# decay = min(0.99,(1+10000)/(10+10000)) = 0.99
# shadow_variable_var0 = decay * shadow_variable + (1 - decay) * variable = 0.99*4.555 + (1-0.99)*10 = 4.60945
# shadow_variable_var1 = 0.99*9.01+(1-0.99)*10 = 9.0199
sess.run(maintain_averages_op)
print(sess.run([var0, ema.average(var0), var1, ema.average(var1)])) # 输出[10,4.60945,10,9.0199]
下面是tensorflow官方给出的两种滑动模型使用场景:
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...
``` There are two ways to use the moving averages for evaluations: * Build a model that uses the shadow variables instead of the variables.
For this, use the `average()` method which returns the shadow variable
for a given variable.
* Build a model normally but load the checkpoint files to evaluate by using
the shadow variable names. For this use the `average_name()` method. See
the @{tf.train.Saver} for more
information on restoring saved variables. Example of restoring the shadow variable values: ```python
# 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
```
"""
day-18 滑动平均模型测试样例的更多相关文章
- linux可靠信号和非可靠信号测试样例
不可靠信号(在执行自定义函数其间会丢失同类信号) 可靠信号(在执行自定义函数其间不会丢失同类信号) 不可靠信号用一次以后,就恢复其默认处理吗? 至少在ubuntu 12.04上,已经是一次绑定,永远使 ...
- monkey测试样例
我们通过在CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试了.首先,我们准备了一个有bug的项目CityWeather:通过测试这个项目(源码在附件文件夹中) ...
- django中的view测试和models测试样例
感觉用model_mommy比factory_boy要好些. 如果Models.py如下: from django.db import models from django.contrib.auth. ...
- tesseract 测试样例
该图片的链接为https://raw.githubusercontent.com/Python3WebSpider/TestTess/master/image.png,可以直接保存或下载. 首先用命令 ...
- Spring Junit 测试样例
SpringMVC 框架下的junit测试方式 package com.sixeco.user.controller; import org.apache.logging.log4j.LogManag ...
- (转)滑动平均法、滑动平均模型算法(Moving average,MA)
原文链接:https://blog.csdn.net/qq_39521554/article/details/79028012 什么是移动平均法? 移动平均法是用一组最近的实际数据值来预测未来一期或几 ...
- 一文详解滑动平均法、滑动平均模型法(Moving average,MA)
任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI.算法.编程和大数据知识分享,以及免费的SSR节点和 ...
- tensorflow:实战Google深度学习框架第四章02神经网络优化(学习率,避免过拟合,滑动平均模型)
1.学习率的设置既不能太小,又不能太大,解决方法:使用指数衰减法 例如: 假设我们要最小化函数 y=x2y=x2, 选择初始点 x0=5x0=5 1. 学习率为1的时候,x在5和-5之间震荡. im ...
- (转)深入解析TensorFlow中滑动平均模型与代码实现
本文链接:https://blog.csdn.net/m0_38106113/article/details/81542863 指数加权平均算法的原理 TensorFlow中的滑动平均模型使用的是滑动 ...
随机推荐
- TCP/IP协议族之链路层(二)
TCP/IP学习记录,如有错误请指正,谢谢!!! TCP/IP协议族之链路层(二) 链路层是最底层协议,主要有三个目的: 1. 为IP模块发送和接收IP数据报 2. 为ARP模块发送ARP请求和接收A ...
- RCF的简单使用教程以及什么是回调函数
RCF的使用教程 RCF(Remote Call Framework)是一个使用C++编写的RPC框架,在底层RCF支持多种传输实现方式(transport implementations). 包括T ...
- stl学习之namespace
一.为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突. 在 C语言中定义了3个层次的作用域,即文件(编译单元).函数和复合语句.C++ ...
- HTML表格-table
表格 表格由 <table> 标签来定义. 每个表格均有若干行(由 <tr> 标签定义),每行被分割为若干单元格(由 <td> 标签定义). 字母 td 指表格数据 ...
- PHP变量定义及工作原理
1.变量定义: 通常学到的是,变量代表存储空间以及其中数据的一个“标识符”. 变量名 指向 变量值 更深入的说是 变量指向内存的一块区域 2.变量工作原理,通过画图分析法——内存空间 <?php ...
- Java常用容器对比
ArrayList与Vector ArrayList和Vector内部都是由数组实现的,数组实现的优点就是支持元素的随机访问(O(1)),但是在对元素进行插入和删除操作时,需要向后或向前移动数组,这样 ...
- (待整理)flume操作----------hivelogsToHDFS案例----------运行时,发生NoClassDefFoundError错误
1. 2.错误日志 命令为 bin/flume-ng agent --name a2 --conf conf/ --conf-file job/file-hdfs.conf Info: Sourcin ...
- STM32F407+STemwin学习笔记之STemwin移植
原文链接:http://www.cnblogs.com/NickQ/p/8748011.html 环境:keil5.20 STM32F407ZGT6 LCD(320*240) STemwin:S ...
- 第8天 Java基础语法
第8天 Java基础语法 今日内容介绍 Eclipse开发工具 超市库存管理系统 Eclipse开发工具 Eclipse是功能强大Java集成开发工具.它可以极大地提升我们的开发效率.可以自动编译,检 ...
- 《TCP/IP详解 卷1:协议》第3章 IP:网际协议
3.1 引言 IP是TCP/IP协议族中最为核心的协议.所有的TCP.UDP.ICMP及IGMP数据都以IP数据报格式传输(见图1-4).许多刚开始接触TCP/IP的人对IP提供不可靠.无连接的数据报 ...