conda 装tensorboardx_【工欲善其事】TensorboardX的使用
“我不喜欢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.htmltensorboardx.readthedocs.io
conda 装tensorboardx_【工欲善其事】TensorboardX的使用相关推荐
- conda虚拟环境安装pytorch+tensorboardX可视化工具
安装要求: pytorch没有tensorflow那样具有tensorboard可视化工具,在pytorch中想要进行可视化可以调用tensorboardX,具体的调用与tensorboard类似,因 ...
- conda 装tensorboardx_Pytorch数据可视化:TensorboardX安装及使用(安装测试+实例演示)...
数据可视化:TensorboardX安装及使用 tensorboard作为Tensorflow中强大的可视化工具: https://github.com/tensorflow/tensorboard, ...
- conda 安装tensorboardX
conda install -c conda-forge tensorboardx 其实用这一句就可以在python条件下,import成功了
- anconda使用---使用conda管理python环境
一.动机 最近打算折腾vn.py,但只有py27版本的,因为一向习惯使用最新稳定版的,所以不得不装py27的环境,不得不说 Python的全局锁真的很烦. 身为懒癌患者,必然使用全功能的anaco ...
- pip 和conda
区别:pip是Python包的通用管理器: conda是一个与语言无关的跨平台环境管理器.pip在任何环境中安装python包:conda需要安装在conda环境中装任何包. Pip代表Pip Ins ...
- pip install 和conda install的区别是什么?
pip install 和conda install的区别是什么?今天番茄加速就来分析下. 大部分情况下没什么区别.基本上,我更喜欢用pip,因为国内用pip网速比conda快哈哈,即便是用了国内源的 ...
- 使用conda已安装python工具包,但Pycharm中仍提示缺包,解决办法
问题 使用conda安装了python的工具包,使用list也看到了,但是在利用Pycharm运行代码时,仍然是红线提示提示缺工具包,第一次使用一个包的时候通过提示里面的安装,直接在pycharm里面 ...
- conda 命令和pip命令的区别,以及conda命令大全
一.conda 命令和pip命令的区别 pip是用来安装python包的,安装的是python wheel或者源代码的包.从源码安装的时候需要有编译器的支持,pip也不会去支持python语言之外的依 ...
- conda cudnn版本升级_ubuntu18.04系统下NVIDIA显卡驱动+cuda+cudnn安装+conda虚拟环境配置...
深度学习的显卡环境配置是一个非常麻烦的问题,理论上这是一个深度学习开发必须要面临的问题,那么教程就应该很多,后人学习起来的时候应该会很容易,实际上却是教程良莠不齐,而且很多教程往往是针对特定显卡的,但 ...
最新文章
- 回归算法 - 线性回归求解 θ(最大似然估计求解)
- 计算机科学与技术第二章ppt,计算机科学与技术-编译原理-第二章重点.ppt
- centos 安装java1.7_centOs安装jdk1.7
- Spring Cloud【Finchley】-18 Zuul过滤器
- 数据结构之直接插入排序图文详解及代码(C++实现)
- 自然语言处理领域的两种创新观念
- qt designer 插入图片_老同学春节祝福语图片
- python 温度转换程序_Python程序将米转换为码
- 如何提高安卓代码的质量和语法
- 基于三维激光点云的目标识别与跟踪研究
- NSOperation队列实实现多线程
- 鲲鹏凌云,并行科技Paramon通过华为云鲲鹏云服务兼容性认证
- 一分钟了解阿里云产品:高速通道
- 网页视频之H5+Mse
- JAVA实现杨辉三角的三种方式
- python实验总结与反思_近期总结与反思
- proposal_target_layer.py (FPN)
- 忆我的大学老师----(一)
- python数据分析实验报告心得_Python实训周总结
- 深入浅出TCP三次握手 (多图详解)