zoukankan      html  css  js  c++  java
  • PyTorch项目使用TensorboardX进行训练可视化

    转自:(41条消息) 详解PyTorch项目使用TensorboardX进行训练可视化_浅度寺-CSDN博客_tensorboardx

    什么是TensorboardX

    Tensorboard 是 TensorFlow 的一个附加工具,可以记录训练过程的数字、图像等内容,以方便研究人员观察神经网络训练过程。可是对于 PyTorch 等其他神经网络训练框架并没有功能像 Tensorboard 一样全面的类似工具,一些已有的工具功能有限或使用起来比较困难 (tensorboard_logger, visdom等) 。TensorboardX 这个工具使得 TensorFlow 外的其他神经网络框架也可以使用到 Tensorboard 的便捷功能。TensorboardX 的 github仓库在这里。

    配置TensorboardX

    环境要求

    • 操作系统:MacOS / Ubuntu (Windows未测试)
    • Python2/3
    • PyTorch >= 1.0.0 && torchvision >= 0.2.1 && tensorboard >= 1.12.0

    以上版本要求你对应TensorboardX@1.6版本。为保证版本时效性,建议大家按照 TensorboardX github仓库中README 的要求进行环境配置。

    安装

    可以直接使用 pip 进行安装,或者从源码进行安装。

    使用 pip 安装

    pip install tensorboardX

    从源码安装

    git clone https://github.com/lanpa/tensorboardX && cd tensorboardX && python setup.py install

    使用TensorboardX

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

    #举个例子
    from
    tensorboardX import SummaryWriter # Creates writer1 object. # The log will be saved in 'runs/exp' writer1 = SummaryWriter('runs/exp') # Creates writer2 object with auto generated file name # The log directory will be something like 'runs/Aug20-17-20-33' writer2 = SummaryWriter() # Creates writer3 object with auto generated file name, the comment will be appended to the filename. # The log directory will be something like 'runs/Aug20-17-20-33-resnet' writer3 = SummaryWriter(comment='resnet')

    以上展示了三种初始化 SummaryWriter 的方法:

    1. 提供一个路径,将使用该路径来保存日志(如上面writer1
    2. 无参数,默认将使用 runs/日期时间 路径来保存日志(如上面writer2
    3. 提供一个 comment 参数,将使用 runs/日期时间-comment 路径来保存日志(如上面writer3

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

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

    tensorboard --logdir=<your_log_dir>

    注意:上面命令其中的 <your_log_dir> 既可以是单个 run 的路径,如上面 writer1 生成的 runs/exp;也可以是多个 run 的父目录,如 runs/ 下面可能会有很多的子文件夹,每个文件夹都代表了一次实验。

                 我们令 --logdir=runs/ 就可以在 tensorboard 可视化界面中方便地横向比较 runs/ 下不同次实验所得数据的差异。

    使用各种 add 方法记录数据

    下面详细介绍 SummaryWriter 实例的各种数据记录方法,并提供相应的示例供参考。(可以运行测试)

    数字 (scalar)

    使用 add_scalar 方法来记录数字常量

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

    参数

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

    需要注意,这里的 scalar_value 一定是 float 类型,如果是 PyTorch scalar tensor,则需要调用 .item() 方法获取其数值。我们一般会使用 add_scalar 方法来记录训练过程的 loss、accuracy、learning rate 等数值的变化,直观地监控训练过程。

    Example:

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

    这里,我们在一个路径为 runs/scalar_example 的 run 中分别写入了二次函数数据 quadratic 和指数函数数据 exponential,原博主在浏览器可视化界面中效果如下:

     但是在我本地上只能出现:并没有曲线(我的对应版本是:tensorboard==2.6.0,tensorflow==2.6.2,torch==1.10.0,torchvision==0.11.1,Os为win10,麻烦知道的跟我说一声

     再次新建一个python文件如下

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

    接下来我们在另一个路径为 runs/another_scalar_example 的 run 中写入名称相同但参数不同的二次函数和指数函数数据,可视化效果如下。我们发现相同名称的量值被放在了同一张图表中展示,方便进行对比观察。同时,我们还可以在屏幕左侧的 runs 栏选择要查看哪些 run 的数据。

    图片 (image)

    使用 add_image 方法来记录单个图像数据注意,该方法需要 pillow 库的支持

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

    参数:

    tag (string): 数据名称
    img_tensor (torch.Tensor / numpy.array): 图像数据
    global_step (int, optional): 训练的 step
    walltime (float, optional): 记录发生的时间,默认为 time.time()
    dataformats (string, optional): 图像数据的格式,默认为 'CHW',即 Channel x Height x Width,还可以是 'CHW'、'HWC' 或 'HW' 等

    我们一般会使用 add_image 来实时观察生成式模型的生成效果,或者可视化分割、目标检测的结果,帮助调试模型。

    Example

    from tensorboardX import SummaryWriter
    import cv2 as cv
    
    writer = SummaryWriter('runs/image_example')
    for i in range(1, 6):
        writer.add_image('countdown',
                         cv.cvtColor(cv.imread('{你自己的图片文件名【我是放在当前文件同路径,你可以选择绝对路径】如下图}.jpg'.format(i)), cv.COLOR_BGR2RGB),
                         global_step=i,
                         dataformats='HWC')

    比如当前python 问价为demo3,图片为1.jpg,目录结构如下:

    add_image 方法只能一次插入一张图片。如果要一次性插入多张图片,有两种方法:

    1. 使用 torchvision 中的 make_grid 方法 [官方文档] 将多张图片拼合成一张图片后,再调用 add_image 方法。
    2. 使用 SummaryWriter 的 add_images 方法 [官方文档],参数和 add_image 类似,在此不再另行介绍。

    直方图 (histogram)

    使用 add_histogram 方法来记录一组数据的直方图。

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

    参数

    tag (string): 数据名称
    values (torch.Tensor, numpy.array, or string/blobname): 用来构建直方图的数据
    global_step (int, optional): 训练的 step
    bins (string, optional): 取值有 ‘tensorflow’、‘auto’、‘fd’ 等, 该参数决定了分桶的方式,详见这里。
    walltime (float, optional): 记录发生的时间,默认为 time.time()
    max_bins (int, optional): 最大分桶数

    我们可以通过观察数据、训练参数、特征的直方图,了解到它们大致的分布情况,辅助神经网络的训练过程。

    Example

    from tensorboardX import SummaryWriter
    import numpy as np
    
    writer = SummaryWriter('runs/embedding_example')
    writer.add_histogram('normal_centered', np.random.normal(0, 1, 1000), global_step=1)
    writer.add_histogram('normal_centered', np.random.normal(0, 2, 1000), global_step=50)
    writer.add_histogram('normal_centered', np.random.normal(0, 3, 1000), global_step=100)

    我们使用 numpy 从不同方差的正态分布中进行采样。打开浏览器可视化界面后,我们会发现多出了"DISTRIBUTIONS"和"HISTOGRAMS"两栏,它们都是用来观察数据分布的。其中在"HISTOGRAMS"中,同一数据不同 step 时候的直方图可以上下错位排布 (OFFSET) 也可重叠排布 (OVERLAY)。如下第一图为"DISTRIBUTIONS"界面,第二和第三为"HISTOGRAMS"界面。

     同一数据不同 step 时候的直方图可以上下错位排布 (OFFSET) 也可重叠排布 (OVERLAY):分别对应如下2图

    运行图 (graph)

    使用 add_graph 方法来可视化一个神经网络。

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

    参数

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

    该方法可以可视化神经网络模型,TensorboardX 给出了一个官方样例大家可以尝试。样例运行效果如下:

    嵌入向量 (embedding)

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

    参数

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

    add_embedding 是一个很实用的方法,不仅可以将高维特征使用PCA、t-SNE等方法降维至二维平面或三维空间显示,还可观察每一个数据点在降维前的特征空间的K近邻情况。下面例子中我们取 MNIST 训练集中的 100 个数据,将图像展成一维向量直接作为 embedding,使用 TensorboardX 可视化出来。(下面是原博主代码,但是运行时出现错误,可能版本问题)

    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,:],
        metadata=mnist.train_labels[:100],
        label_img = mnist.train_data[:100,:,:].reshape((-1, 1, 28, 28)).float() / 255,
        global_step=0
    )

    修改后的代码

    from tensorboardX import SummaryWriter
    import torchvision
    
    writer = SummaryWriter('runs/embedding_example1')
    mnist = torchvision.datasets.MNIST('mnist', download=True)
    writer.add_embedding(
        mnist.data.reshape((-1, 28 * 28))[:100,:],
        metadata=mnist.targets[:100],
        label_img = mnist.data[:100,:,:].reshape((-1, 1, 28, 28)).float() / 255,
        global_step=0
    )

    采用 PCA 降维后在三维空间可视化效果如下:

     可以发现,虽然还没有做任何特征提取的工作,但 MNIST 的数据已经呈现出聚类的效果,相同数字之间距离更近一些(有没有想到 KNN 分类器)。我们还可以点击左下方的 T-SNE,用 t-SNE 的方法进行可视化。

     add_embedding 方法需要注意的几点:

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

    其他

    TensorboardX 除了上述的常用方法之外,还有许多其他方法如 add_audioadd_figure 等,感兴趣的朋友可以参考[官方文档]。相信读了这篇文章过后,你已经能够类比熟练调用其他的方法了。

    一些tips
    (1)如果在进入 embedding 可视化界面时卡住,请更新 tensorboard 至最新版本 (>=1.12.0)。
    (2)tensorboard 有缓存,如果进行了一些 run 文件夹的删除操作,最好重启 tensorboard,以避免无效数据干扰展示效果。
    (3)如果执行 add 操作后没有实时在网页可视化界面看到效果,试试重启 tensorboard。
    ————————————————

  • 相关阅读:
    JavaScript 数组操作函数--转载+格式整理
    Python之__str__类的特殊方法
    Django 模板层(Template)
    jquery基础
    Django基础(web框架)
    前端基础之JavaScript对象
    前端基础之JavaScript
    MySQL数据库之索引
    MySQL数据库之多表查询
    MySQL 数据库之单表查询
  • 原文地址:https://www.cnblogs.com/cy0628/p/15592930.html
Copyright © 2011-2022 走看看