“我不喜欢Tensorflow,但这并不妨碍我使用tensorboard”

上一篇文章(https://zhuanlan.zhihu.com/p/39849027),和大家简单地聊了一下关于如何在训练过程中有序地组织log问题。今天,想和大家简单地谈谈tensorboard的使用。

经过社区的努力,目前PyTorch也可以使用tensorboard了。在训练过程中实时地观察loss/accuracy曲线,并据此来判断网络的训练情况,对每一个DLer来说,想必都是一种极为理想的事情。今天,我们就来简单谈谈tensorboardX的使用。

首先,还是老样子,明确一下我们的需求:1. 实时记录训练过程中的相关数据(训练loss,测试loss,测试Accuracy等等);

2. 将训练 / 测试相关数据放在一起,方便对比;

一、安装

tensorboardX是针对tensorboard的一个封装,以使得PyTorch用户也能够用到tensorboard。了解到这一点后,我们需要:1)安装tensorboard,2)安装tensorboardX。

安装方法也很简单,使用pip安装,或者在自己的conda虚拟环境中安装都是可以的。

二、使用

tensorboardX的组成比较简单,基本上只有一个类,还有围绕这几个类的一些成员方法。我们主要介绍一下tensorboardX.SummaryWriter以及add_scalar。

在tensorboardX中只有一个类,那就是SummaryWriter,你可以定义许多个SummaryWriter(只要你喜欢);

所有需要记录的东西(如图表、直方图、图片,标量等等)都可以简单方便的通过类的成员方法(以"add"开头的一系列函数)来进行定义。

class tensorboardX.SummaryWriter(log_dir=None, comment='', **kwargs)

如上所示,是SummaryWriter类的API。通常而言,要指定一个类对象,你只需要指定它的log_dir就好啦~对tensorboard有过了解的同学一定明白,要启动tensorboard,必须指定它的logdir(默认为runs)。

那么指定log_dir就给了我们控制权:结合上一篇文章,我们可以将其指定为程序执行时的时间(如:2018-07-24T19:28),这样方便我们后续进行查找。参考下列代码块:

import time

from tensorboardX import SummaryWriter

current_time = time.strftime("%Y-%m-%dT%H:%M", time.localtime())

my_writer = SummaryWriter(log_dir=current_time)

执行上述代码后,tensorboard的events文件就会被保存在以时间为文件名的目录下方。

当你已经有了一个writer,就可以方便地往里面写各种东西,比如说,你可以写图片、写声音、写直方图等等等等。不过我们不需要那么花哨哈哈,我们只需要写我们的loss值、Accuracy值就可以了。一句话,我们要写的是:标量!

那么tensorboard同样提供了API来给我们写标量。为了省事,我直接将API贴过来了:

add_scalar函数,主要有3个参数(都很重要)。tag表明这是一个什么样的标量,一般都是见名知意(比如loss,acc等);scalar_value没什么可说的;global_step代表步长下标。举例来说,你想记录loss,每100个batch记录一次,那么global_step就是100,200,300,……

到这里,关于tensorboardX的内容就介绍完了。多说一句,当你把全部代码写完以后,不要忘了在命令行中执行tensorboard的命令来启动它:

user@server:~$ tensorboard --log-dir=${PATH_TO_LOG}

三、实战

再回顾一下我们的需求:1. 实时记录训练过程中的相关数据(训练loss,测试loss,测试Accuracy等等);

2. 将训练 / 测试相关数据放在一起,方便对比;

在基本对tensorboardX有了一个大概的了解后,第一点应该是很好解决。下面我们主要谈一下第二点。

在上文中我们也提到了,在启动tensorboard的时候,我们需要在bash里面敲命令指定log-dir。实际上tensorboard会在你指定的这个log-dir里面做路径搜索,寻找所有的events文件以及子文件夹中的events文件。

什么意思呢?举个例子吧:

user@server:~project$ tree .

.

├── config.yaml

├── epoch10_model.pt

├── Eval

│ └── events.out.tfevents.1532432460.amax

├── log.txt

└── Train

└── events.out.tfevents.1532432460.amax

2 directories, 5 files

可以看到,当前目录下有两个子文件夹:Train和Eval。在这两个子文件夹下分别有它们各自对应的events文件,那么假如我们执行:

user@server:~project$ tensorboard --log-dir=~/project

tensorboard就会在这个目录下进行迭代搜索,而这两个events文件也都会被找到。

了解到这个工作原理,我们就可以很轻松的解决第二点需求啦:首先,我们声明两个SummaryWriter,分别将他们保存在“xxx/Train”目录下,以及“xxx/Eval”目录下。

将我们需要对比的变量(比如说每个epoch的loss,这里写作“Epoch Loss”),在add_scalar的时候赋予同样的名字(tag)

完毕!

因为首先,tensorboard的搜索机制会保证将Train/events和Eval/events都搜索出来;第二点,因为两个scalar是同名的,所以在最后数据呈现过程中,会将它们放在一起显示。如下图所示:

如上图所示,Train过程记录了以iteration为单位的loss和以epoch为单位的Epoch_Loss,而在Eval过程中则记录了以Epoch为单位的Epoch_Loss和Accuracy。

当左下角都勾选时,可以看到,我们能够比较每个Epoch的平均loss大小。如果我们只想看某条曲线的话,直接勾选左下角就能方便地切换了。

最后的最后,为了防止我的语言表达能力太差,还是放一个不能跑的伪代码:

import time

import os

from tensorboardX import SummaryWriter

class Processor(object):

def __init__():

self.global_step = 0

self.load_logging()

def load_logging(self):

self.work_dir = time.strftime("%Y-%m-%dT%H:%M", time.localtime())

if not os.path.exists(self.work_dir):

os.makedirs(self.work_dir)

# Tensorboard initialization.

self.trainwriter = SummaryWriter('{}/{}'.format(self.work_dir, 'Train'))

self.evalwriter = SummaryWriter('{}/{}'.format(self.work_dir, 'Eval'))

def train(epoch):

model.train()

for i, data in enumerate(train_loader):

# suppose after forward pass, we got loss.

self.global_iter += 1

if self.global_iter % 1e2 == 0: # Every 100 iters, we record it!

self.trainwriter.add_scalar('Loss', loss, self.global_iter)

self.trainwriter.add_scalar('Epoch Loss', average_loss, epoch+1)

def eval(epoch):

model.eval()

for i, data in enumerate(test_loader):

# suppose after forward pass, we got loss.

self.evalwriter.add_scalar('Epoch Loss', average_loss, epoch+1)

self.evalwriter.add_scalar('Accuracy', acc, epoch+1)

def start():

for i in range(NUM_EPOCHS):

train(i); eval(i)

if __name__=="__main__":

processor = Processor()

processor.start()

注意,这个代码跑不了的哦,只是为了演示一下~~

Reference:http://tensorboardx.readthedocs.io/en/latest/index.html​tensorboardx.readthedocs.io

conda 装tensorboardx_【工欲善其事】TensorboardX的使用相关推荐

  1. conda虚拟环境安装pytorch+tensorboardX可视化工具

    安装要求: pytorch没有tensorflow那样具有tensorboard可视化工具,在pytorch中想要进行可视化可以调用tensorboardX,具体的调用与tensorboard类似,因 ...

  2. conda 装tensorboardx_Pytorch数据可视化:TensorboardX安装及使用(安装测试+实例演示)...

    数据可视化:TensorboardX安装及使用 tensorboard作为Tensorflow中强大的可视化工具: https://github.com/tensorflow/tensorboard, ...

  3. conda 安装tensorboardX

    conda install -c conda-forge tensorboardx 其实用这一句就可以在python条件下,import成功了

  4. anconda使用---使用conda管理python环境

    一.动机 最近打算折腾vn.py,但只有py27版本的,因为一向习惯使用最新稳定版的,所以不得不装py27的环境,不得不说  Python的全局锁真的很烦.  身为懒癌患者,必然使用全功能的anaco ...

  5. pip 和conda

    区别:pip是Python包的通用管理器: conda是一个与语言无关的跨平台环境管理器.pip在任何环境中安装python包:conda需要安装在conda环境中装任何包. Pip代表Pip Ins ...

  6. pip install 和conda install的区别是什么?

    pip install 和conda install的区别是什么?今天番茄加速就来分析下. 大部分情况下没什么区别.基本上,我更喜欢用pip,因为国内用pip网速比conda快哈哈,即便是用了国内源的 ...

  7. 使用conda已安装python工具包,但Pycharm中仍提示缺包,解决办法

    问题 使用conda安装了python的工具包,使用list也看到了,但是在利用Pycharm运行代码时,仍然是红线提示提示缺工具包,第一次使用一个包的时候通过提示里面的安装,直接在pycharm里面 ...

  8. conda 命令和pip命令的区别,以及conda命令大全

    一.conda 命令和pip命令的区别 pip是用来安装python包的,安装的是python wheel或者源代码的包.从源码安装的时候需要有编译器的支持,pip也不会去支持python语言之外的依 ...

  9. conda cudnn版本升级_ubuntu18.04系统下NVIDIA显卡驱动+cuda+cudnn安装+conda虚拟环境配置...

    深度学习的显卡环境配置是一个非常麻烦的问题,理论上这是一个深度学习开发必须要面临的问题,那么教程就应该很多,后人学习起来的时候应该会很容易,实际上却是教程良莠不齐,而且很多教程往往是针对特定显卡的,但 ...

最新文章

  1. 回归算法 - 线性回归求解 θ(最大似然估计求解)
  2. 计算机科学与技术第二章ppt,计算机科学与技术-编译原理-第二章重点.ppt
  3. centos 安装java1.7_centOs安装jdk1.7
  4. Spring Cloud【Finchley】-18 Zuul过滤器
  5. 数据结构之直接插入排序图文详解及代码(C++实现)
  6. 自然语言处理领域的两种创新观念
  7. qt designer 插入图片_老同学春节祝福语图片
  8. python 温度转换程序_Python程序将米转换为码
  9. 如何提高安卓代码的质量和语法
  10. 基于三维激光点云的目标识别与跟踪研究
  11. NSOperation队列实实现多线程
  12. 鲲鹏凌云,并行科技Paramon通过华为云鲲鹏云服务兼容性认证
  13. 一分钟了解阿里云产品:高速通道
  14. 网页视频之H5+Mse
  15. JAVA实现杨辉三角的三种方式
  16. python实验总结与反思_近期总结与反思
  17. proposal_target_layer.py (FPN)
  18. 忆我的大学老师----(一)
  19. python数据分析实验报告心得_Python实训周总结
  20. 深入浅出TCP三次握手 (多图详解)

热门文章

  1. 神经网络“炼丹炉”内部构造长啥样?牛津大学博士小姐姐用论文解读
  2. 北大陈平原教授:写出优秀的学术论文,“小题大做”是关键
  3. 计算机技能需求新排名:Python 仅排第 3,第 1 你可能猜不到哦
  4. 哈佛终身教授:年轻人如何做科研?
  5. 操作系统学习:内存分页与中断
  6. linux定时任务简记
  7. 聊天机器人之语料准备
  8. C语言连续指针_只愿与一人十指紧扣_新浪博客
  9. 手把手教你实现GAN半监督学习
  10. 你不知道的车牌识别系统