Tensorboard 及 TensorboardX 的安装与使用

Tensorboard 用来干什么?

  • Tensorboard 是 tensorflow 内置的一个可视化工具
  • Tensorboard 的可视化依赖于 tensorflow 程序运行输出的日志文件,因而 tensorboard 和 tensorflow 程序在不同的进程中运行

如何安装并开启 Tensorboard 服务?

  • pip 安装
    1
    2
    python -m pip install tensorboard
    tensorboard --logdir=2017_05_03_00_12

Tensorboard、TensorboardX 与 torch.utils.tensorboard 的关系?

  • Tensorboard 是 Tensorflow 用于检查和理解模型及训练情况的 Web 应用
    1
    from tensorboard import SummaryWriter
  • 在 Pytorch 发布的早期,没有支持 tensorboard 强大的数字可视化工具,由 lanpa (Github 用户名) 开发出 TensorboardX,可认为是 Tensorboard 库的第三方改编版
    1
    from tensorboardX import SummaryWriter
  • PyTorch1.10 后,官方支持 tensorboard 功能,导入 torch. utils. tensorboard 进行使用,注意:使用之前必须先安装 tensorboard 包
    1
    from torch.utils.tensorboard import SummaryWriter
  • TensorboardX 与 torch.utils.tensorboard 大多数代码是相同的,除了 torch.utils.tensorboard 在 logging 时依赖于 tensorboard。另一个区别是 tensorboardX 支持其他框架,例如 chainer,而 torch.utils.tensorboard 更特定于 pytorch

如何安装 tensorBoardX?

  • pip 安装
    1
    pip install tensorboardX
  • 源码安装
    1
    pip install 'git+https://github.com/lanpa/tensorboardX'
  • 安装加速包
    1
    pip install crc32c
  • 安装音频加速包
    1
    pip install soundfile

TensorboardX 有哪些功能?

  • scalar 标量仪表板
  • image 图像仪表板
  • figure matplotlib 图形渲染为图像可视化
  • histogram 直方图仪表板
  • audio 音频仪表板
  • text 文本仪表板
  • graph 图形数据(模型)
  • embedding 可视化高维数据
  • pr_curve 添加精确召回曲线
  • mesh 添加网格或 3D 点云
  • hyper-parameters 超参数
  • video 视频数据仪表板

torch.utils.tensorboard 使用例子?

  • 训练 mnist_train 数据,并可视化训练数据与模型
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import torch
    import torchvision
    from torch.utils.tensorboard import SummaryWriter
    from torchvision import datasets, transforms
    # Writer will output to ./runs/ directory by default
    writer = SummaryWriter()
    transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
    trainset = datasets.MNIST('mnist_train', train=True, download=True, transform=transform)
    trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
    model = torchvision.models.resnet50(False)
    # Have ResNet model take in grayscale rather than RGB
    model.conv1 = torch.nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)
    images, labels = next(iter(trainloader))
    grid = torchvision.utils.make_grid(images)
    writer.add_image('images', grid, 0) #可视化数据
    writer.add_graph(model, images) #可视化模型
    writer.close()
  • 运行 tensorboard 查看训练数据
  • 运行 tensorboard 查看训练模型

认识 torch.utils.tensorboard 中 SummaryWriter 类 ?

  • 该类是记录数据以供 TensorBoard 使用和可视化的主要入口
  • 该类提供了一个高层次的 API 来创建指定目录的事件文件,并添加摘要和事件给它
  • 该类支持异步更新文件内容
  • 允许训练程序直接从训练循环调用方法将数据添加到文件中,而不会减慢训练速度

torch.utils.tensorboard 中 SummaryWriter 类 的初始化?

  • 参数
    • log_dir (string) – 保存目录位置。默认为 runs/ CURRENT_DATETIME_HOSTNAME,每次运行后都会更改。使用分层文件夹结构轻松比较运行。例如,为每个新实验传入 ‘runs/exp1’、‘runs/exp2’ 等以在它们之间进行比较。
    • comment (string) – 附加到默认值的注释 log_dir 后缀 log_dir。如果 log_dir 已分配,则此参数无效。
    • purge_step (int) – 当日志在步骤崩溃时 T+X 吨 + X 并在步骤重新启动 吨吨,global_step 大于或等于的任何事件 吨吨将从 TensorBoard 中清除和隐藏。请注意,崩溃和恢复的实验应该具有相同的 log_dir.
    • max_queue (int) – 在 “添加” 调用之一强制刷新到磁盘之前,挂起事件和摘要的队列大小。默认为十项。
    • flush_secs (int) – 将挂起的事件和摘要刷新到磁盘的频率(以秒为单位)。默认为每两分钟。
    • filename_suffix (string) – 添加到 log_dir 目录中所有事件文件名的后缀。有关 tensorboard.summary.writer.event_file_writer.Even
  • 例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from torch.utils.tensorboard import SummaryWriter
    # 使用自动创建的文件夹初始化一个SummaryWriter
    writer = SummaryWriter()
    # folder location: runs/May04_22-14-54_s-MacBook-Pro.local/
    # 使用手动创建的文件夹初始化一个SummaryWriter
    writer = SummaryWriter("my_experiment")
    # folder location: my_experiment
    # create a summary writer with comment appended.
    writer = SummaryWriter(comment="LR_0.1_BATCH_16")
    # folder location: runs/May04_22-14-54_s-MacBook-Pro.localLR_0.1_BATCH_16/

torch.utils.tensorboard 的使用?

  • add_scalar
    • 将标量数据添加到汇总中
    • 参数
      • tag (string) – 数据标识符
      • scalar_value (float 或 string/blobname) – 要保存的值
      • global_step (int) – 要记录的全局步长值
      • walltime (float) – 可选覆盖默认 walltime (time.time ()) 与事件纪元后的秒数
      • new_style (boolean) – 是使用新样式(张量字段)还是旧样式(simple_value 字段)。新样式可能会导致更快的数据加载。
    • 例子
      1
      2
      3
      4
      5
      6
      from torch.utils.tensorboard import SummaryWriter
      import numpy as np
      write=SummaryWriter()
      for i in range(100):
      write.add_scalar("randomvalue",np.random.randint(0,100),i)
      write.close()
    • 结果
  • add_scalars
    • 添加一组标量
    • 参数
      • tag (string) – 数据标识符
      • scalar_value (float 或 string/blobname) – 要保存的值
      • global_step (int) – 要记录的全局步长值
      • walltime (float) – 可选覆盖默认 walltime (time.time ()) 与事件纪元后的秒数
    • 例子
      1
      2
      3
      4
      5
      write=SummaryWriter()
      r = 5
      for i in range(100):
      write.add_scalars("run_14h",{"xsinx":i*np.sin(i/r),"xcosx":i*np.cos(i/r),"tanx":np.tan(i/r)},i)
      write.close()
    • 结果
  • add_histogram
    • 添加直方图
    • 参数
      • tag (string) – 数据标识符
      • 值(torch.Tensor、numpy.array 或 string/blobname)– 构建直方图的值
      • global_step (int) – 要记录的全局步长值
      • bins (string) – {‘tensorflow’,‘auto’, ‘fd’, …} 之一。这决定了垃圾箱的制作方式。您可以在以下位置找到其他选项:
      • walltime (float) – 事件纪元后可选的覆盖默认 walltime (time.time ()) 秒
    • 例子
      1
      2
      3
      4
      5
      6
      7
      8
      9
      write=SummaryWriter()
      x=np.random.random(1000)
      write.add_histogram("demo_histogram01",x,0)
      write.close()
      write=SummaryWriter()
      for i in range(10):
      x=np.random.random(1000)
      write.add_histogram("demo_histogram02",x+i,i)
      write.close()
    • 结果
  • add_image
    • 添加图像数据到摘要中
    • 参数
      • tag (string) – 数据标识符
      • img_tensor (torch.Tensor , numpy.array , or string/blobname) – 图像数据
      • global_step (int) – 要记录的全局步长值
      • walltime (float) – 事件纪元后可选的覆盖默认 walltime (time.time ()) 秒
      • dataformat (str)- 数据格式,默认 “CHW”,可使用函数 torchvision.utils.make_grid () 转换 1 个 batch 的 image
    • 例子
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      import torchvision
      import torch
      write=SummaryWriter()
      # CHW格式
      imgCHW=np.zeros((3,100,100))
      imgCHW[0]=np.arange(0,10000).reshape((100,100))/10000
      imgCHW[1]=1-np.arange(0,10000).reshape((100,100))/10000
      # HWC格式
      imgHWC=np.zeros((100,100,3))
      imgHWC[...,0]=np.arange(0,10000).reshape((100,100))/10000
      imgHWC[...,1]=1-np.arange(0,10000).reshape((100,100))/10000
      # 批量的CHW格式
      imgNCHW=[]
      imgNCHW.append(torch.tensor(imgCHW))
      imgNCHW.append(torch.tensor(imgCHW))
      grid = torchvision.utils.make_grid(imgNCHW)
      write.add_image("image_CHW",img,1)
      write.add_image("image_HWC",imgHWC,1,dataformats="HWC")
      write.add_image("image_NHWC",grid,1)
      write.close()
    • 结果
  • add_images
    • 参数
      • tag (string) – 数据标识符
      • img_tensor (torch.Tensor , numpy.array , or string/blobname) – 图像数据
      • global_step (int) – 要记录的全局步长值
      • walltime (float) – 事件纪元后可选的覆盖默认 walltime (time.time ()) 秒
      • dataformat (str)- 数据格式,默认 “CHW”,可使用函数 torchvision.utils.make_grid () 转换 1 个 batch 的 image
    • 例子
      1
      2
      3
      4
      5
      6
      7
      8
      writer=SummaryWriter()
      img_batch = np.zeros((16, 3, 100, 100))
      for i in range(16):
      img_batch[i, 0] = np.arange(0, 10000).reshape(100, 100) / 10000 / 16 * i
      img_batch[i, 1] = (1 - np.arange(0, 10000).reshape(100, 100) / 10000) / 16 * i
      print(img_batch.shape)
      writer.add_images('my_image_batch', img_batch, 0)
      writer.close()
    • 结果
  • figure
    • matplotlib 图形渲染为图像可视化
  • histogram
    • 直方图仪表板
  • audio
    • 音频仪表板
  • text
    • 文本仪表板
  • graph
    • 图形数据(模型)
  • embedding
    • 可视化高维数据
  • pr_curve
    • 添加精确召回曲线
  • mesh
    • 添加网格或 3D 点云
  • hyper-parameters
    • 超参数
  • video
    • 视频数据仪表板