Pytorch中使用TensorBoard

本文记录了如何在Pytorch中使用Tensorboard(主要是为了备忘)

TensorBoard的界面

Pytorch中使用TensorBoard

虽然我本身就会用TensorBoard,但是因为TensorBoard只有在写训练代码的框架的时候才会写,因此实际上写的频率的还是很低的,所以我每次要写训练代码、使用TensorBoard的时候都需要看自己之前写的代码,或者查一下别人写的博客。而且不少博客写的都是一鳞半爪的,不少用法都要查很多博客,久而久之就会觉得很烦。而且很多技巧随着时间的流逝也逐渐的忘记。

因此为了方便以后自己的查询(备忘),同时也是能够留下一个不错的教程,因此决定自己写一个比较全面的TensorBoard的教程。

1. Introduction to TensorBoard

在炼丹的时候,经常需要追踪模型在训练过程中性能的变化,例如:Regression任务中的MSE、分类任务中的准确率、生成(图片)任务中图片的生成质量、此外还有合成语音的质量……

大体上来说,所有需要追踪的数据包括:标量(scalar)、图像(image)、统计图(diagram)、视频(video)、音频(audio)、文本(text)、Embedding等等

除了有大量的数据需要追踪外,我们还需要很好的把这些数据显示出来,即数据的写入和显示(读取)要有异步IO,有的时候服务器在学校的机房托管,因此还需要能够通过内网提供可视化……

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

因此,就有了TensorBoard这个网页程序实现了我们上面的需求。TensorBoard最早是TensorFlow中的模块,不过现在经过Pytorch团队的努力,TensorBoard已经集成到了Pytorch中。

TensorFlow官网上的TensorBoard

TensorBoard的教程主要分为两部分,一部分是如何使用TensorBoard(即在训练过程中添加数据,然后在浏览器中监视训练的这整个pipeline)的教程,另外一部分是TensorBoard如何添加不同种类数据(即TensorBoard的API)的教程

2. TensoBoard Pipeline

上面说道,TensorBoard是分为前段显示和后端数据记录的,因此其Pipeline也分为两步:

A. 后端数据记录

类似于FlaskDjango中把后端程序(服务器)被抽象为了一个类,然而这个类中提供了方法来开启和关闭服务,TensorBoard中也是把后端服务器抽象成了一个类:SummaryWriter,不过不同的是,TensorBoard中的SummaryWriter类在被声明后就开启了对应的服务,直到我们使用了SummaryWriter关闭服务的API。

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

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

0. 导入包

我们首先导入包

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='')

其中:

因此,一个成熟的数据记录方式就是在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_")])

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

SummaryWriter中所有添加数据的API

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年3月9日 下午11:36
下一篇 2023年3月9日 下午11:37

相关推荐