pyTorch可视化工具——TensorBoard基础函数展示(API)

你是否有这样的疑惑?在我们完成深度学习项目工程中,很多时候我们自己构建模型结构,或者在学习深度学习算法的时候,由于算法结构过于复杂,很难充分理解模型结构层次。你是否想看到自己的模型训练指标与参数的变化情况。很多时候,我们自己构建完成训练后,需要在通过修改参数来评估模型的好坏,同时还需要对相应的指标进行可视化,这样是不是有些麻烦。
它来了!!!TensorBoard是一款神奇的可视化辅助工具,它能够很好的和pytorch进行配合

 前言

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

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

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

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

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

在pytorch可视化工具——TensorBoard中主要可以使用到的函数有

add_scalar(tag, scalar_value, global_step=None, walltime=None)

add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)

add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None)

add_image(tag, img_tensor, global_step=None, walltime=None)

add_graph(model, input_to_model=None, verbose=False, **kwargs)

add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='de fault', metadata_header=None)

下面将会对函数的具体使用进行详细的介绍操作。

1.常用函数功能SummaryWriter()

这个函数用于创建一个tensorboard文件,其中常用参数有:

  • log_dir:tensorboard文件的存放路径
  • flush_secs:表示写入tensorboard文件的时间间隔

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类。

在书写代码的时候我的个人习惯是设置指定的文件保存路径,所以我的个人书写习惯如下。

log_dir="./train_log/test_log_dir"#设置文件的保存路径
writer = SummaryWriter(log_dir=log_dir)

 常用的头文件如下:

import torchvision.models as models
import torch
from torch.utils.tensorboard import SummaryWriter
import numpy as np
import matplotlib.pyplot as plt

tensorboard启动命令

 tensorboard --logdir "./"

2. add_scalar(),功能:记录标量的变化常用于Loss和Accuarcy曲线的记录

add_scalar(tag, scalar_value, global_step=None,walltime=None)
  • tag ( string ) – 数据标识符
  • scalar_value ( float或string/blobname ) – 要保存的值:相当于是x的值
  • global_step ( int ) – 要记录的全局步长值:相当于是y的值
  • walltime ( float ) – 记录训练的时间,默认 walltime (time.time()) 秒
  • new_style ( boolean ) – 是使用新样式(张量字段)还是旧样式(simple_value 字段)。新样式可能会导致更快的数据加载。

例子1:

from torch.utils.tensorboard import SummaryWriter
import numpy as np
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
for x in range(1, 101) :
    writer.add_scalar('y = 2x', x, 2 * x)
writer.close()

 

3、. add_scalars(),功能:记录标量的变化,常用于对比,比如trainLoss和validLoss的比较等

add_scalars(main_tag, tag_scalar_dict,global_step=None, walltime=None)
  •  main_tag ( string ) – 标签的父名称
  • tag_scalar_dict ( dict ) – 存储标签和对应值的键值对:相当于y的值。
  • global_step ( int ) – 要记录的全局步长值:相当于x的值
  • walltime ( float ) – 记录训练的时间,默认 walltime (time.time()) 秒

案列:

from torch.utils.tensorboard import SummaryWriter
import numpy as np
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
r = 5
for x in range(1, 101) :
    writer.add_scalars('run_14h', {'xsinx' : x * np.sin(x / r),
                                  'xcosx' : x * np.cos(x / r),
                                  'xtanx' : x * np.tan(x / r)}, x)
writer.close()

 案例2:

#coding = utf-8
from torch.utils.tensorboard import SummaryWriter
import numpy as np
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
train_loss = [3.5,2.0,2.5,2.0]
dev_loss = [3.0,2.0,2.5,2.0]
for i in range(len(train_loss)):
    writer.add_scalars("loss",{"train":train_loss[i],"dev":dev_loss[i]},i+1)

for n_iter in range(100):
    writer.add_scalars('data',
       {"xsinx": n_iter * np.sin(n_iter),
        "xcosx": n_iter * np.cos(n_iter),
         "arctanx": np.arctan(n_iter)},
        n_iter)
writer.close()

 

 

4、. add_histogram(),功能:统计直方图与多分位数折线图

add_histogram(tag, values, global_step=None,bins='tensorflow', walltime=None)

绘制直方图和多分位数折线图,常用于监测权值及梯度的分布变化情况,便于诊断网 络更新方向是否正确。 

• tag:图像的标签名,图的唯一标识
• values:要统计的参数
• global_step:y轴
• bins:取直方图的bins 

from torch.utils.tensorboard import SummaryWriter
import numpy as np
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
for step in range(10) :
    x = np.random.randn(1000)
    writer.add_histogram('distribution of gaussion', x, step)
writer.close()

 

 

 x 轴即变量大小, y 轴为 gloabl_step。 377 表示卷积层 conv1 的权值中有 377 个 weight 的大小是在 0. 036 这个区间。

5、. add_image(),功能:记录图像

绘制图片,可用于检查模型的输入,监测 feature map 的变化,或是观察 weight。

add_image(tag, img_tensor, global_step=None,walltime=None, dataformats='CHW')

• tag:图像的标签名,图的唯一标识
• img_tensor:图像数据,注意尺度
• global_step:x轴
• dataformats:数据形式,CHW,HWC,HW 

from torch.utils.tensorboard import SummaryWriter
import numpy as np
import cv2 as cv
import torch
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
img = cv.imread('test1.jpg', cv.IMREAD_COLOR)#输入图像要是3通道的,所以读取彩色图像
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
img = torch.tensor(img.transpose(2, 0, 1))#cv读取为numpy图像为(H * W * C),所以要进行轴转换
writer.add_image('zhou_ge', img, 0)
writer.close()

 

6、torchvision.utils.make_grid,功能:制作网格图像

make_grid(tensor, nrow=8, padding=2,normalize=False, range=None, scale_each=False,pad_value=0)

• tensor:图像数据, B*C*H*W形式
• nrow:行数(列数自动计算)
• padding:图像间距(像素单位)
• normalize:是否将像素值标准化
• range:标准化范围
• scale_each:是否单张图维度标准化
• pad_value:padding的像素值

7、. add_graph(),功能:可视化模型计算图

add_graph(model, input_to_model=None, verbose=False)

• model:模型,必须是 nn.Module
• input_to_model:输出给模型的数据
• verbose:是否打印计算图结构信息  

  •  model( torch.nn.Module ) – 要绘制的模型。
  • input_to_model ( torch.Tensor or list of torch.Tensor ) – 要输入的变量或变量元组
  • verbose(bool)– 是否在控制台中打印图形结构。
  • use_strict_trace ( bool ) – 是否将关键字参数严格传递给 torch.jit.trace。当您希望跟踪器记录您的可变容器类型(列表、字典)时传递 False.
from torch.utils.tensorboard import SummaryWriter
import numpy as np
import torch
import torch.nn as nn
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
class MLP(nn.Module) :
    def __init__(self):
        super(MLP, self).__init__()
        self.Net = nn.Sequential(
            nn.Linear(784, 512),
            nn.ReLU(),
            nn.Linear(512, 128),
            nn.ReLU(),
            nn.Linear(128, 10)
        )
    def forward(self, input):
        input = input.view(-1, 28 * 28)
        return self.Net(input)
model = MLP()
input = torch.FloatTensor(np.random.rand(32, 1, 28, 28))
writer.add_graph(model, input)
writer.close()

 

 8、torch.summary,功能:查看模型信息,便于调试

summary(model, input_size, batch_size=-1,device="cuda")

• model:pytorch模型
• input_size:模型输入size
• batch_size:batch size
• device:“cuda” or “cpu”

参考文献

神经网络学习小记录49——Pytorch当中Tensorboard的使用_Bubbliiiing的博客-CSDN博客_writer.add_graph

Pytorch中使用TensorBoard_鸿神的博客-CSDN博客_pytorch使用tensorboard

pytorch使用——(十三)TensorBoard_我学数学我骄傲的博客-CSDN博客

Pytorch深度学习——Tensorboard的使用_麓山南麓的博客-CSDN博客_tensorboard使用

详解Tensorboard及使用教程_八岁爱玩耍的博客-CSDN博客_tensorboard

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲游山河十万里

你的鼓励是我们创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值