pytorch 笔记:tensorboardX

Posted UQI-LIUWJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch 笔记:tensorboardX相关的知识,希望对你有一定的参考价值。

1 SummaryWriter

1.1 创建

首先,需要创建一个 SummaryWriter 的示例:

from tensorboardX import SummaryWriter

#以下是三种不同的初始化 SummaryWriter 的方法

writer1 = SummaryWriter('runs/exp')
#提供一个路径,将使用该路径来保存日志

writer2 = SummaryWriter()
#无参数,默认将使用 runs/日期时间 路径来保存日志

writer3 = SummaryWriter(comment='resnet')
#提供一个 comment 参数,将使用 runs/日期时间-comment 路径来保存日志

        一般来讲,我们对于每次实验新建一个路径不同的 SummaryWriter,叫作一个 run,如 runs/exp1、runs/exp2。

1.2 可视化

        接下来,我们就可以调用 SummaryWriter 实例的各种 add_something 方法向日志中写入不同类型的数据了。想要在浏览器中查看可视化这些数据,只要在命令行中开启 tensorboard 即可:

tensorboard --logdir=<your_log_dir>

        其中的 <your_log_dir> 可以是单个 run 的路径,如上面 writer1 生成的 runs/exp;

         <your_log_dir> 也可以是多个 run 的父目录,如  runs/ 下面可能会有很多的子文件夹,每个文件夹都代表了一次实验,我们令 --logdir=runs/ ,就可以在 tensorboard 可视化界面中方便地横向比较 runs/ 下不同次实验所得数据的差异。

2 使用add 记录数据

2.1 添加数字 add_scalar

记录数字常量。

2.1.1 基本使用方法

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

2.1.2 参数介绍

tag (string)数据名称,不同名称的数据使用不同曲线展示
scalar_value (float)数字常量值
global_step (int, optional)训练的 step
walltime (float, optional)记录发生的时间,默认为 time.time()

2.1.3 举例

from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/scalar_example')
for i in range(10):
    writer.add_scalar('quadratic', i**2, global_step=i)
    writer.add_scalar('exponential', 2**i, global_step=1)

首先,在对应的路径出现了scalar_example 文件夹

         然后可视化之(这里我已经cd到runs的路径上了,所以使用的是相对路径。当然绝对路径也是可以的)

tensorboard --logdir=scalar_example

        会出来一行这个:

Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.7.0 at http://localhost:6006/ (Press CTRL+C to quit)

2.1.4 多个 writer

from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/example_test/scalar_example')
for i in range(10):
    writer.add_scalar('quadratic', i**2, global_step=i)
    writer.add_scalar('exponential', 2**i, global_step=i)
writer1 = SummaryWriter('runs/example_test/scalar_example1')
for i in range(10):
    writer1.add_scalar('quadratic', i**3, global_step=i)
    writer1.add_scalar('exponential', 3**i, global_step=i)

 2.1.5 add_scalar注意事项

        这里的 scalar_value 一定是 float 类型。

        如果是 PyTorch scalar tensor,则需要调用 .item() 方法获取其数值。

        我们一般会使用 add_scalar 方法来记录训练过程的 loss、accuracy、learning rate 等数值的变化,直观地监控训练过程。
 

2.2 add_histogram 添加直方图

2.2.1 使用方法

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

2.2.2 参数说明

tag (string) 数据名称
values (torch.Tensor, numpy.array, or string):用来构建直方图的数据
global_step (int, optional)训练的 step
bins (string, optional)

 该参数决定了分桶的方式

具体见:numpy.histogram_bin_edges — NumPy v1.21 Manual

walltime (float, optional)记录发生的时间,默认为 time.time()
max_bins (int, optional)最大分桶数

2.2.3 使用举例

from tensorboardX import SummaryWriter

writer = SummaryWriter('runs/embedding_example2')

writer.add_histogram(
    'normal_centered5', 
    np.random.normal(0, 1, 1000), 
    global_step=1,
    max_bins=100)
writer.add_histogram(
    'normal_centered5', 
    np.random.normal(0, 2, 1000), 
    global_step=1,
    max_bins=100)
writer.add_histogram(
    'normal_centered5', 
    np.random.normal(0, 3, 1000), 
    global_step=1,
    max_bins=100)

writer.add_histogram(
    'normal_centered6', 
    np.random.normal(0, 1, 1000), 
    global_step=1,
    max_bins=100)
writer.add_histogram(
    'normal_centered6', 
    np.random.normal(0, 2, 1000), 
    global_step=5,
    max_bins=100)
writer.add_histogram(
    'normal_centered6', 
    np.random.normal(0, 3, 1000), 
    global_step=10,
    max_bins=100)

在tensorboard的histograms里面有:(但我并没有弄明白这时候的global_step有什么作用。。。望评论区赐教)、

overlay

【global_step=1,1,1  VS global_step=1,5,10】

 offset

【global_step=1,1,1  VS global_step=1,5,10】

 2.3  add_graph 添加图

 使用 add_graph 方法来可视化一个神经j

2.3.1 基本使用方法

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

 2.3.2 参数使用说明

model (torch.nn.Module):待可视化的网络模型
input_to_model (torch.Tensor or list of torch.Tensor, optional) 待输入神经网络的变量或一组变量

2.3.3 使用举例 

pytorch笔记:VGG 16_UQI-LIUWJ的博客-CSDN博客

import torch, torchvision
 
model = torchvision.models.vgg16()

writer=SummaryWriter('graph')
writer.add_graph(model,torch.ones((1,3, 224, 224)))

 展开之后是

 随便点开一个block:

 

 2.4 add_embedding 

使用 add_embedding 方法可以在二维或三维空间可视化 embedding 向量。

2.4.1 使用方法

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

2.4.2 参数说明

mat (torch.Tensor or numpy.array)一个矩阵,每行代表特征空间的一个数据点
metadata (list or torch.Tensor or numpy.array, optional)一个一维列表,mat 中每行数据的 label,大小应和 mat 行数相同
global_step (int, optional)训练的 step
label_img (torch.Tensor, optional)一个形如 NxCxHxW 的张量,对应 mat 每一行数据显示出的图像,N 应和 mat 行数相同
tag (string, optional)数据名称,不同名称的数据将分别展示

2.4.3 举例

from tensorboardX import SummaryWriter
import torchvision

writer = SummaryWriter('runs/embedding_example')
mnist = torchvision.datasets.MNIST('mnist', download=True)
writer.add_embedding(
    mnist.train_data.reshape((-1, 28 * 28))[:100,:],
    #每一行是一个数据,前100个数据
    metadata=mnist.train_labels[:100],
    label_img = mnist.train_data[:100,:,:].reshape((-1, 1, 28, 28)).float() / 255,
    global_step=0
)

 

 

2.4.4 作用

        add_embedding 是一个很实用的方法,不仅可以将高维特征使用PCA、t-SNE等方法降维至二维平面或三维空间显示,还可观察每一个数据点在降维前的特征空间的K近邻情况。

        上面的例子中我们取 MNIST 训练集中的 100 个数据,将图像展成一维向量直接作为 embedding,使用 TensorboardX 可视化出来。

2.4.5 注意事项

add_embedding 方法需要注意的几点:

  • mat 是二维 NxM,metadata 是一维 N,label_img 是四维 NxCxHxW!
  • label_img 记得归一化为 0-1 之间的 float 值

参考资料:

详解PyTorch项目使用TensorboardX进行训练可视化_浅度寺-CSDN博客_tensorboardx

以上是关于pytorch 笔记:tensorboardX的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch使用tensorboardX可视化。超详细!!!

Pytorch使用tensorboardX网络结构可视化。超详细!!!

tensorboardX笔记:理解graph

pytorch tensorboardX可视化问题:AttributeError: 'torch._C.Value' object has no attribute 'debu

pytorch怎么一张图显示几个模型的几条曲线

Tensorboard安装和访问(pytorch+MobaXterm)