pytorch的tensorboard可视化,pytorch tensorboardx

  pytorch的tensorboard可视化,pytorch tensorboardx

  本文主要介绍在Pytorch中使用TensorBoard的细节。TensorBoard的前端数据显示和后端数据记录是异步I/O,即后端程序将数据写入文件,前端程序读取文件中的数据进行显示。

  00-1010前言1、TensorBoard简介2、TensoBoard流水线3、后端数据记录1。SummaryWriter类2。添加数据3。关闭SummaryWriter4。总结4。前端显示数据1。默认使用2。修改端口5,1。摘要作者APIs这篇文章记录了如何在Pytorch中使用Tensorboard(主要用于备忘录)

  

目录

  虽然我自己会用TensorBoard,但是因为TensorBoard只写训练代码的框架,所以写的频率还是很低的,所以每次写训练代码,使用TensorBoard的时候,都需要看一下自己以前的代码,或者查一下别人写的博客。更何况很多博客都是碎片化的,很多博客都要查使用情况,久而久之会很烦。而很多技能随着时间的推移也逐渐被遗忘。

  所以为了以后方便自己查询(备忘录),留下好的教程,我决定自己写一个TensorBoard的综合教程。

  

前言

  在alchemy中,经常需要跟踪模型在训练过程中的性能变化,比如回归任务中的MSE、分类任务中的精度、图片生成任务中的图片生成质量、合成语音质量等.

  一般来说,所有要跟踪的数据包括:标量、图像、图表、视频、音频、文本、嵌入等等。

  除了要跟踪大量的数据,我们还需要很好的显示这些数据,也就是数据要用异步IO来写和显示(读)。有时服务器托管在学校的计算机房,因此也需要能够通过内部网提供可视化.

  所以在各种需求下,用一个web程序来帮助我们跟踪数据是一个很好的解决方案。具体来说,网页程序实现了前端和后端的分离。后端只需要专注于数据记录,前端专注于数据显示。此外,web程序还可以进一步扩展以提供网络服务。

  所以TensorBoard这个web程序实现了我们的上述要求。TensorBoard原本是TensorFlow中的一个模块,现在经过Pytorch团队的努力,TensorBoard已经集成到Pytorch中。

  TensorBoard的教程主要分为两部分,一是如何使用TensorBoard(即在训练时添加数据,然后在浏览器中监控训练的整个流水线),二是如何添加不同种类的数据(即TensorBoard的API)。

  

一、 Introduction to TensorBoard

  如上所述,TensorBoard分为前端显示和后端数据记录,因此其流水线也分为两步:

  第一步:后端数据记录第二步:检查上一节的数据。

  

二、TensoBoard Pipeline

  与Flask和Django类似,后端程序(服务器)被抽象为一个类。但是,这个类提供了打开和关闭服务的方法,TensorBoard还将后端服务器抽象为一个类:SummaryWriter。但不同的是TensorBoard中的SummaryWriter类在声明后启动相应的服务,直到我们使用SummaryWriter的API关闭服务。

  >此外,还有一个不同的之处在于,TensorBoard的前段数据显示和后端数据记录是异步I/O的,即后端程序(SummaryWriter类的实例)将数据写入到一个文件中,而前端程序读取文件中的数据来进行显示。因此后端所谓的服务指的就是数据的记录,而非提供前端的显示。数据记录的实现方式即通过SummaryWriter类中的方法

  然后在开启了后端程序的服务器之后,我们就可以通过各种API来添加数据了

  导入包:

  我们首先导入包

  

import torch

  from torch.utils.tensorboard import SummaryWriter

  

  

1. SummaryWriter类

  SummaryWriter声明之后就会开启后端数据记录的服务,因此在实例化该类的时候我们就需要保存数据的位置。声明保存数据的位置有好几种方式

  SummaryWriter的签名如下:

  

class torch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment=, purge_step=None, max_queue=10, flush_secs=120, filename_suffix=)

  其中:

  

  • log_dir (str):指定了数据保存的文件夹的位置,如果该文件夹不存在则会创建一个出来。如果没有指定的话,默认的保存的文件夹是./runs/现在的时间_主机名,例如:Feb04_22-42-47_Alienware,因此每次运行之后都会创建一个新的文件夹。在写论文的时候我们会涉及一系列实验,从不同的角度来说明一些问题,例如我们的假设是否正确、模型性能是否更好……因此最好不要用默认的实现来直接作为存放数据的文件夹,而是使用具有含义的二级结构,例如:runs/exp1。这样的话,所有的实验1的数据都在这个文件夹下,这样我们就可以方便的进行比较。
  • comment (string):给默认的log_dir添加的后缀,如果我们已经指定了log_dir具体的值,那么这个参数就不会有任何的效果
  • purge_step (int):TensorBoard在记录数据的时候有可能会崩溃,例如在某一个epoch中,进行到第 T + X T+X T+X个step的时候由于各种原因(内存溢出)导致崩溃,那么当服务重启之后,就会从 T T T个step重新开始将数据写入文件,而中间的 X X X,即purge_step指定的step内的数据都被被丢弃。
  • max_queue (int):在记录数据的时候,在内存中开的队列的长度,当队列慢了之后就会把数据写入磁盘(文件)中。
  • flush_secs (int):以秒为单位的写入磁盘的间隔,默认是120秒,即两分钟。
  • filename_suffix (string):添加到log_dir中每个文件的后缀。更多文件名称设置要参考tensorboard.summary.writer.event_file_writer.EventFileWriter类。

  因此,一个成熟的数据记录方式就是在runs文件夹下按照一定的意义来划分二级文件夹,例如网络结构1网络结构2实验1实验2等等。

  

  

2. 添加数据

  想后端服务程序添加数据使用的是SummaryWriter类中的一系列方法,这些方法都以add_开头,例如:add_scalaradd_scalarsadd_image……具体来说,所有的方法有:

  

import pprint

  pprint.pprint([i for i in SummaryWriter.__dict__.keys() if i.startwith("add_")])

  

add_hparams,add_scalar,add_scalars,add_histogram,add_histogram_raw,add_image,add_images,add_image_with_boxes,add_figure,add_video,add_audio,add_text,add_onnx_graph,add_graph,add_embedding,add_pr_curve,add_pr_curve_raw,add_custom_scalars_multilinechart,add_custom_scalars_marginchart,add_custom_scalars,add_mesh

  

  后面在第二部分会详细的讲解每个方法,这里先讲共性。

  

  每个方法根据需要添加的数据的不同,方法中具体的参数也不同,但是所有的方法终归都是要添加数据的,因此会存在相同的参数。具体来说,相同的参数包括:

  

  • tag (str):用于给数据进行分类的标签,标签中可以包含父级和子级标签。例如给训练的loss以loss/train的tag,而给验证以loss/val的tag,这样的话,最终的效果就是训练的loss和验证的loss都被分到了loss这个父级标签下。而trainval则是具体用于区分两个参数的标识符(identifier)。例如我们现在有两个tag,cos/densecos/sparse,那么最终展示下来的效果是这样的。此外,只支持二级标签

  

  

  • globa_step (int):首先,每个epoch中我们都会更新固定的step。因此,在一个数据被加入的时候,有两种step,第一种step是数据被加入时当前epoch已经进行了多少个step,第二种step是数据被加入时候,累计(包括之前的epoch)已经进行了多少个step。而考虑到我们在绘图的时候往往是需要观察所有的step下的数据的变化,因此global_step指的就是当前数据被加入的时候已经计算了多少个step。计算global_step的步骤很简单,就是 g l o b a l _ s t e p = e p o c h ∗ l e n ( d a t a l o a d e r ) + c u r r e n t _ s t e p global\_step=epoch * len(dataloader) + current\_step global_step=epoch∗len(dataloader)+current_step
  • wlltime (int):从SummaryWriter实例化开始到当前数据被加入时候所经历时间(以秒计算),默认是使用time.time()来自动计算的,当然我们也可以指定这个参数来进行修改。这个参数一般不改

  以添加标量(add_scalar)为例,演示一下添加数据的方法的用法。其他的方法第二部分会讲

  

writer = SummaryWriter()

  for epoch in range(n_epoch := 10):

   for step in range(total_step := 100):

   # 训练代码读取数据来进行显示。

   # ...

   # ...

   # 计算 loss

   loss = np.sin(step * 0.01)

   # 添加标量

   writer.add_scalar(tag="loss/train", scalar_value=loss,

   global_step=epoch * total_step + step)

  然后可以看到的效果如下:

  

  

  

3. 关闭SummaryWriter

  我们刚才说过,SummaryWriter这样的后端程序在被实例化出来就自动开启了数据记录的服务,而我们在完成了所有的数据记录只有,需要关闭服务。

  关闭服务很简单,就是直接调用close方法即可

  

writer.close()

  

  

4. Summary

  最终,总结一下整个后端数据记录的流程,其实就三步:

  实例化SummaryWriter类,同时指定数据保存的文件夹利用SummaryWriter类提供的方法,添加不同类型的的数据关闭SummaryWriter类,中止服务

  

  

四、前端显示数据

  因为TensorBoard是异步I/O的网页服务程序,因此后端程序在把数据写入到文件的时候,前端程序可以读取数据来进行显示。

  具体来说,后端数据记录程序会把所有的数据记录到同一个文件夹下的多个文件内,以方便前端显示程序多线程加速读取。因此,前端显示程序在启动的时候需要指定读取的文件夹

  

  

1. 默认使用

  前端显示程序提供了CLI(命令行)界面,因此我们直接在命令行启动就行了

  

tensorboard --logdir=数据文件夹

  其中数据文件夹就是在声明SummaryWriter时候指定的文件夹。

  例如:

  

tensorboard --logdir=./Feb05_01-00-48_Alienware/

  而在我们启动前端显示程序之后,就会得到一个端口,访问这个端口就能看到显示的效果

  

  访问该端口就能看到程序:

  

  

  

2. 修改端口

  有的时候,在服务器上训练模型的时候为了避免和别人的TensorBoard的端口撞了,我们需要指定新的端口。或者有的时候我们在docker容器里跑TensorBoard,我们通过一个端口映射到主机上去,这个时候就需要指定TensorBoard使用特定的端口。

  具体来说就是通过CLI的--port参数

  

tensorboard --logdir=数据文件夹 --port=端口

  例如我们现在指定上面的例子端口为10000

  

tensorboard --logdir=./Feb05_01-00-48_Alienware/ --port=10000

  

  

  

五、Summary

  最后,总结一下使用TensorFlow的Pipeline,首先在训练的过程中使用SummaryWriter来记录数据,记录的过程中需要注意文件夹需要来合理的划分。

  然后我们在前端查看的时候,运行tensorboard的CLI程序即可,一般用的最多的就是--log_dir--port两个参数。

  此外,如果是服务器上的话,那么tensorboard的CLI运行在服务器上,然后在自己的电脑上,利用浏览器,通过内网来查看训练过程。

  

  

1. SummaryWriter APIs

  上面讲完了SummaryWriter的Workflow/Pipeline,剩下的就是SummaryWriter添加数据的API的讲解了。关于这些API的话,正如上面介绍的,他们都以add_开头,具体有:

  标量类:add_scalaradd_scalarsadd_custom_scalarsadd_custom_scalars_marginchartadd_custom_scalars_multilinechart

  数据显示类:

  

  • 图像:add_imageadd_imagesadd_image_with_boxesadd_figure
  • 视频:add_video
  • 音频:add_audio
  • 文本:add_text
  • ​​​​​​​Embedding:add_embedding
  • ​​​​​​​点云:add_mesh

  统计图:add_histogramadd_histogram_rawadd_pr_curve、add_pr_curve_raw

  网络图:add_onnx_graphadd_graph

  ​​​​​​​超参数图:add_hparams

  因为我目前主要在做CV、点云和NLP,对于语音、视频设计的比较少,因此关于这些API以后用到了我再慢慢补充。

  其实主要就是对官网上的翻译,可以直接看官网上的介绍:https://pytorch.org/docs/stable/tensorboard.html

  到此这篇关于Pytorch中使用TensorBoard详情的文章就介绍到这了,更多相关Pytorch TensorBoard内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: