1.estimator评估流程

(1)定义model_fn
在estimator中,不论是训练、评估还是预测,都需要定义model_fn,model_fn返回EstimatorSpec对象,通常不同的mode需要的EstimatorSpec对象参数也不太一样,比如训练阶段往往需要指定train_op来定义如何训练,预测阶段指定predictions表示输出哪些结果,评估阶段(ModeKeys.EVAL)需要eval_metric_ops参数来指定用评估的指标。eval_metric_ops是Dict of metric results keyed by name,该dict的value可以是两种: (1) Metric 类的实例. (2) metric function返回结果——即(metric_tensor, update_op)元组。关于metric指标,如果不了解,另起文章来介绍tf.metrics

def model_fn(features, labels, mode, params):if mode== tf.estimator.ModeKeys.TRAIN:# xxxif mode== tf.estimator.ModeKeys.PREDICT:# xxxif mode == tf.estimator.ModeKeys.EVAL:def metric_fn(eval_losses, label, eval_pred):mean_eval_loss = tf.metrics.mean(values=eval_losses)eval_accuracy = tf.metrics.accuracy(labels=label,predictions=eval_pred)return {"mean_eval_loss": mean_eval_loss,"eval_accuracy ": eval_accuracy}eval_metric_ops = metric_fn(your_loss, label, your_pred)output_spec = tf.estimator.EstimatorSpec(mode=mode, loss=your_loss, eval_metric_ops=eval_metric_ops)return output_spec

(2)定义input_fn

def input_fn():# define your input_fn here. Typically, you can use tf.data.Dataset  api to read files return features, labels

这一步和模型训练阶段一样,不作赘述。可以参考之前的文档。
(3)调用estimator.evaluate评估

# 这里的steps是设定评估用多少数据,一个step就是一个batch
# hooks参数定义了一些在session执行前后,已经每个step执行前后的一些操作,比如打印日志、调整学习率等。
result = estimator.evaluate(input_fn=input_fn,steps=eval_steps,hooks=your_hooks)

我们需要评估的指标放在eval_metric_ops,这些指标会在评估结束后(steps次或者文件结束)最后打印结果。有时候希望每个step都打印一些loss和auc等日志,可以在在hook中实现。如果不知道hook是什么,可以参考我的另一篇文章:Hook

2.评估代码内部调用关系

上面只是基本的使用方法,estimator帮我们完成了背后的各种调用,但如果希望有一些更深入的了解或者定制化需求,需要看看evaluate背后的调用关系。

先看看estimator的evaluate函数:

def evaluate(self, input_fn, steps=None, hooks=None, checkpoint_path=None,name=None)

参数steps定义评估使用多少数据,一个step就是一个batch,这个参数主要是用在那些数据源源不断或者数据集很大时,可以使用一部分数据来评估。hooks是tf.train.SessionRunHook对象,主要是定义sessionc创建、run前后、session关闭时执行的一些操作,比如调整学习率,打印一些评估指标等等。
evaluate函数会调用_actual_eval函数:

_actual_eval(self, input_fn, strategy=None, steps=None, hooks=None, checkpoint_path=None, name=None):

这个_actual_eval函数首先会把steps注册成一个_StopAfterNEvalsHook。这里这个hook的作用是记录tf.session运行step数,在运行steps次后发出请求终止session,评估结束。
_actual_eval函数之后调用_evaluate函数,这个函数做两件重要的事情:(1)调用_evaluate_build_graph函数构建评估的graph;(2)调用_evaluate_run函数执行评估session并返回评估结果。这两个函数各自有一些操作,前者最主要的是调用_call_model_fn_eval,后者最主要是调用evalution模块的_evaluate_once函数,内部的调用关系可以直接对照上面的调用图看源码进一步了解。

3.理解Hook是核心

通过上面的源码调用关系,我们发现eval_metric_ops里的指标在graph构建阶段,把指标函数返回的结果(metric_tensor, update_op)进行了拆分,_evaluate_run处理update_op和metric_tensor是不同的,update_op会每次都更新,比如计算mean就需要持续更新total和count,对于metric_tensor,会将其转化为一个Hook,是一种FinalOpsHook,这是一个tensorlfow自定义的hook类型,也是继承SessionRunHook,FinalOpsHook只实现了父类5个接口中的一个——end函数,也就是session结束后触发相关操作,才会去算最终的一个评估结果。
再结合上一节说的steps在最开始就被转化为一个_StopAfterNEvalsHook,也是一个Hook。
最后所有的Hook,连同input_fn和evaluate函数参数的hooks,都是统一被MonitoredSession执行的。所以,本质上eval_metric_ops和evaluate的hooks本质上是一回事儿,后者其实更灵活,因为你自定义的hooks,不仅可以实现end接口,还能实现其他4个接口,从而在tf.session的创建、run前后、结束后都能执行一些特定的任务,比如每个step打印一些指标而不是在最后才给出最终结果,代价是需要自己实现一个Hook类。

4.参考文献

tensorflow/python/training/evaluation.py
自定义hook打印中间数据
tensorflow笔记(二十二)—— Hooks
Avoiding headaches with tf.metrics——帮你搞懂metrics返回值含义

tensorflow笔记(二十)——estimator.evaluate源码走读相关推荐

  1. Alink漫谈(二十) :卡方检验源码解析

    Alink漫谈(二十) :卡方检验源码解析 文章目录 Alink漫谈(二十) :卡方检验源码解析 0x00 摘要 0x01 背景概念 1.1 假设检验 1.2 H0和H1是什么? 1.3 P值 (P- ...

  2. python学习笔记二——阅读MakeHuman程序源码小结

    1.环境变量 用Python Shell设置或获取环境变量的方法: 一.设置系统环境变量 1.os.environ['环境变量名称']='环境变量值' #其中key和value均为string类型 2 ...

  3. Mr.J-- jQuery学习笔记(三十二)--jQuery属性操作源码封装

    扫码看专栏 jQuery的优点 jquery是JavaScript库,能够极大地简化JavaScript编程,能够更方便的处理DOM操作和进行Ajax交互 1.轻量级 JQuery非常轻巧 2.强大的 ...

  4. Slicer学习笔记(四十二)slicer c++源码编译

    Slicer学习笔记(四十二)slicer c++源码编译 1.cmake生成项目 2.编译失败的原因汇总 2.1.下载代码失败 之前在windows下编译slicer,没有做笔记. 后面再次编译还会 ...

  5. glibc-2.23学习笔记(二)—— free部分源码分析

    glibc-2.23学习笔记(二)-- free部分源码分析 _libc_free _int_free 函数定义 局部变量 start fast bins部分 unsorted bins部分 mmap ...

  6. H5混合开发二维码扫描教程之大圣众娱十人牛牛源码搭建架设

    今天用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触过,心里没底,于是晚上回家开始网上各处找方案. ...

  7. Mr.J-- jQuery学习笔记(二十八)--DOM操作方法(添加方法总结)

    Table of Contents appendTo appendTo(source, target) 源代码 append prependTo ​ ​ ​ ​ prependTo源码 prepend ...

  8. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  9. Live555源码阅读笔记(一):源码介绍文档 及 源码目录结构

    目录 一.Live555介绍 1.Live555项目介绍 2.官网及帮助文档介绍 二.源码目录结构 1.UsageEnvironment 2.BasicUsageEnvironment 3.group ...

最新文章

  1. 条件独立(conditional independence) 结合贝叶斯网络(Bayesian network) 概率有向图 (PRML8.2总结)...
  2. mysql5.7只安装服务端_Windows Mysql5.7.11 服务端安装详解
  3. ios请求php接口失败,laravel,php_iOS调用Laravel接口返回错误信息,laravel,php,ios - phpStudy...
  4. 动态规划训练16 [Doing Homework HDU - 1074 ]
  5. 从每年的编程语言排行来看,为什么C/C++能稳居前五?
  6. vue之神奇的动态按钮
  7. 2月第3周业务风控关注|上海网信办复测23个被约谈APP 涉及1号店、小红书等
  8. java snakeyaml_java – 使用SnakeYAML的嵌套构造
  9. C#——窗体程序,模拟高温高压锅炉降压处理
  10. java lambda表达式 list转string
  11. 精简《JavaScript高级程序设计》五、引用类型(上)
  12. C++,Linux架构师成长之路
  13. H264码流打包分析.整理
  14. ros ubuntu 卸载_ROS安装与卸载
  15. 算法与数据结构学习(46)-B树、B+树和B*树
  16. 我主修计算机科学英文,计算机科学,computer science英语短句,例句大全
  17. c++数独游戏3.0
  18. Android7.0 Phone应用源码分析(二) phone来电流程分析
  19. [附源码]PHP计算机毕业设计社区居家养老管理系统(程序+LW)
  20. android基础篇之Intent用法

热门文章

  1. HDU--1258:Sum It Up (DFS)
  2. cetus权限连接主从mysql_cetus/cetus-quick-try.md at master · session-replay-tools/cetus · GitHub...
  3. Springboot项目配置定时重启案例
  4. ubuntu 制作iso镜像
  5. 如何理解Condition
  6. 春运火车票刷票系统,刷到有票为止!
  7. 海南:2020年中职教育计划招生4.95万人 入学可享多项惠民政策
  8. 当代GIS技术的现状分析
  9. 新加坡南洋理工计算机科学院排名,南洋理工大学世界排名及专业排名汇总(THE世界大学排名版)...
  10. 强强联手,共享数字化盛宴 | 中建信息携手SAP助力人力资源数字化转型