虽然tf官方希望用户把 train , val 程序分开写,但实际开发中,明显写在一起比较简单舒服,但在保存数据到 summary 时, val 部分和 train 部分不太一样,会有一些问题,下面讨论如何在这种情况下记录 train/val 的 summary 。

假设训练时的主要代码结构如下:


losssummary = ...
othersummary = ...
trainsummaries = tf.summary.merge([losssummary, othersummary])
for i in range(self.batchnum):
batching data...
...
... step ... trainsummaryresults = sess.run(... , trainsummaries)
trainfilewriter.addsummary(trainsummaryresults)
if step % self.saveinter == 0:
... # save checkpoint
if step % self.dispinter == 0:
... # display training process
if step % self.testinter == 0:
... # run model on test data

保存 train 部分的 summary 很简单,tf的示例代码也给了很多,先利用 sess.run 计算出 trainsummaryresults ,即当前 batch 的统计数据,然后保存到文件

但在 val 部分时,一般都在所有验证数据上获取 loss , accuracy 等 summary 数据,再保存到文件。这样只有两种方法:

1. val 部分的 batchsize 改为验证集大小
2. batchsize 不变,对所有 batch 上获取的 loss , accuracy 计算平均

第一种方法存在的问题是,如果验证集数据较大, batchsize 会设置的较大,可能会引起内存or显存溢出,这个没法解决。

第二种方法存在的问题是,没法按照train部分的做法做,因为要的是整个验证数据的平均值,而不是每个 batch 的值,这个有办法解决。

在设计模型结构的时候,无论是 train 还是 val ,网络结构都是一样的,每次只能计算一个 batch 的 loss , accuracy ,没法单独为验证集修改。于是我想到了如下投机取巧的方法:先利用循环计算验证集每个 batch 的 loss , accuracy ,进行累加,记为 averageloss 和 averageaccuracy ,然后进行如下操作:

testsummaries = tf.Summary()
lossval = testsummaries.value.add()
lossval.tag = 'loss'
lossval.simplevalue = averageloss / batchnum
accval = testsummaries.value.add()
accval.tag = 'accuracy'
accval.simplevalue = averageaccuracy / batchnum
testfilewriter.addsummary(testsummaries, step)

其实就是自己创建一个 test_summaries ,把需要的东西填进去,模仿利用 sess.run 生成的 train_summary_results ,再保存到文件。大家如果感兴趣可以把 train_summary_results 打印出来,其实就是这么个结构。目前我只保存过 scalar ,但是其他值应该也可以这么保存。

tensorflow简单记录summary方法的更多相关文章

  1. windows安装tensorflow简单直接的方法(win10+pycharm+tensorflow-gpu1.7+cuda9.1+cudnn7.1)

    安装tensorflow-gpu环境需要:python环境,tensorflow-gpu包,cuda,cudnn 一,安装python,pip3直接到官网下载就好了,下载并安装你喜欢的版本 https ...

  2. js/jq基础(日常整理记录)-2-一个简单的js方法实现集合的非引用拷贝

    一.一个简单的js方法实现集合拷贝 做web项目的时候,少不了和js中的数组,集合等对象接触,那么你肯定会发现,在js中存在一个怪异的现象就是数组和集合的拷贝都是地址复制,并不是简单的数据的拷贝. 举 ...

  3. Tensorflow简单CNN实现

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 少说废话多写代码~ """转换图像数据格式时需要将它们的颜色空间变为灰度空间,将图像尺寸修改为同一尺寸,并将标签依 ...

  4. ASP.NET开发常用简单实用的方法

    ASP.NET开发简单实用的方法 一.打印和导出 打印和导出EXCEL在目前ASP.NET开发中可以说是必要的,有时候针对不同数据难易程度下,用有效快速的方法是解决办法的有效途径之一. 1.打印 后台 ...

  5. TensorFlow使用记录 (六): 优化器

    0. tf.train.Optimizer tensorflow 里提供了丰富的优化器,这些优化器都继承与 Optimizer 这个类.class Optimizer 有一些方法,这里简单介绍下: 0 ...

  6. JSP简单记录

    JSP,全称是Java Server Page,是运行在服务器端的页面,是建立在Servlet规范的动态网页技术,JSP文件在第一次请求时,会被编译成Servlet,所以JSP也可以看成是运行中的Se ...

  7. CocoaPods 的简单快速安装方法

    CocoaPods 的简单快速安装方法(Setting up CocoaPods master repo 卡着不动,是因为淘宝镜像已经不能用了. 一.git clone方法安装cocoapods 镜像 ...

  8. MySQL把多个字段合并成一条记录的方法

    转:http://www.111cn.net/database/mysql/71591.htm MySQL把多个字段合并成一条记录的方法 在mysql中字段合并可以使用很多函数来实现,如可以利用 GR ...

  9. TensorFlow简单介绍和在centos上的安装

    ##tensorflow简单介绍: TensorFlow™ is an open source software library for numerical computation using dat ...

随机推荐

  1. c++检查内存泄漏

    使用_CrtDumpMemoryLeaks()函数检查内存泄漏 #include <cstdio> #include <cstdlib> #include <crtdbg ...

  2. C++程序设计方法3:自动类型转换

    方法1:在源类中定义目标类型转换运算符 #include <iostream> using namespace std; class Dst { public: Dst() { cout ...

  3. NOIP考试各种技巧!!

    考前时间利用对考生起着至关重要的作用,不容忽视! 一.考前几分钟时间,往往能决定成败,所以一定要做好心态调整.不要去想结果,只看过程,努力了就一定不会白费.二.在别人紧张.坐立不安的时候,你不妨把时间 ...

  4. oracle 占比函数

    这个函数在oracle帮助文档的位置:SQL Reference里面,很好找的. 除报告详细数据外,许多报告中还包括每行总数的百分比.例如,每名客户的订单相对于总订单的百分比,或每位销售代表的销售额相 ...

  5. 常见问题2:html+css效果综合整理

    1.---文本框提示文字颜色--placeholder属性 <input type="text" placeholder="请输入提示文字" /> ...

  6. 阿里云安装nodejs和mongodb

    1) 安装nodejs wget https://nodejs.org/dist/v8.11.3/node-v8.11.3-linux-x64.tar.xz tar -xf node-v8.11.3- ...

  7. Visual Studio 2015编译Lua 5.3.4遇到的坑

    被坑的不浅,遇到错误:" LNK1561:必须定义入口点",解决方案删除再建,步骤一遍一遍操作,还是报错.如下图所示: 首先,它必须要改成DLL或者LIB(动态/静态库),如果是应 ...

  8. 小白入门使用Nginx基础的常用操作

    nginx启动,重启,关闭命令 停止操作 停止操作前需要ps当前Nginx的所有进程 步骤1:查询nginx主进程号 ps -ef | grep nginx 在进程列表里 面找master进程,它的编 ...

  9. 关于关键字 volatile

    关于 volatile 的使用,也是 C 语言面试的月经问题.标准答案来了: volatile is a qualifier that is applied to a variable when it ...

  10. easylog -- Linux 下的简单日志库

    之前使用 log4c 或者 log4cpp 的时候, 总需要配置一些文件和链接库之类复杂的配置. 虽然越复杂越说明这个软件支持的功能多.可选择性强, 但是对于一个小的项目,或者要研究他人的代码而加点儿 ...