当前位置:   article > 正文

Pytorch1.4内置tensorboard的使用_tensorboard torch1.4.0

tensorboard torch1.4.0

Pytorch1.4内置tensorboard的使用

  • 接口:torch.utils.tensorboard
  • 主要使用 tensorboard.SummaryWriter
  • pytorch1.4集成的是tensorboardX,使用方法与tensorboardX一模一样

Ⅰ. 需要安装的库


  • pytorch1.4: pip install torch==1.4.0
  • tensorboard: pip install tensorboard

Ⅱ. 接口介绍和使用


  1. wirter = SummaryWriter(log_dir=None, comment="", purge_step=None, max_queue=10, flush_secs=120, filename_suffix=’’)

- log_dir: 写入的文件目录,可自定义;默认写入到当前文件夹的runs目录下:runs/current_time_username
- comment: 注释,附加到目录名的后缀
- purge_step: 日志在T+X步崩溃,并在T步重启;大于等于T步的事件将被tensorboard清除并隐藏;注意崩溃的实验和清除的实验应具有相同的log_dir
- max_queue: 等待事件的队列大小, 默认值10
- flush_secs: 刷新事件和摘要到磁盘的时间间隔;默认值2分钟
- filename_suffix: 附加到目录里所有事件的后缀名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. writer.add_audio(tag, snd_tensor, global_step=None, sample_rate=44100, walltime=None)

- tag: 字符串;数据的名称
- snd_tensor: 张量,音频数据,维度1 x L,值在区间\[-1, 1\]
- global_step: 记录步长
- sample_rate: 采样率,单位Hz
- walltime: 可选覆盖默认walltime(time.time()) 事件发生后的秒数(Optional override default walltime (time.time()) seconds after epoch of event)
  • 1
  • 2
  • 3
  • 4
  • 5
  1. writer.add_custom_scalars(layout)

- 通过在“scalars”中收集图表标签来创建特殊图表, 请注意, 对于每个SummaryWriter()此函数只能被调用一次;因为它仅向tensorboard提供元数据,所以该函数可以在训练循环之前或之后被调用。
- layout:字典,{categoryName: *charts*},charts也是一个字典{chartsname: *listofproperties*}. *listofproperties*的第一项是图表类型(Multiline或者Margin),第二个元素应该是包含标签的列表(您已在add_scalar函数中使用过,该函数将被收集到新图表中)
  • 1
  • 2
# 不要运行
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter()
layout = {'Taiwan':{'twse':['Multiline',['twse/0050', 'twse/2330']]},
         'USA':{ 'dow':['Margin',   ['dow/aaa', 'dow/bbb', 'dow/ccc']],
               'nasdaq':['Margin',   ['nasdaq/aaa', 'nasdaq/bbb', 'nasdaq/ccc']]}
         }
writer.add_custom_scalars(layout)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. writer.add_custom_scalars_marginchart(tags, category=‘default’, title=‘untitled’)

- 创建marginchart的简写。 与“ add_custom_scalars()”类似,但唯一必要的参数是* tags *,应该恰好包含3个元素。
- tags: 在“add_scalars()”中使用的标签列表。
  • 1
  • 2
writer.add_custom_scalars_marginchart(['twse/0050', 'twse/2330', 'twse/2006'])
  • 1
  1. writer.add_custom_scalars_multilinechart(tags, category=‘default’, title=‘untitled’)

- 创建multilinechart的缩写,与“add_custom_scalars”类似,但唯一必要的参数是* tags *
- tags:在“add_scalars()”中使用的标签列表。
  • 1
  • 2
writer.add_custom_scalars_multilinechart(['twse/0050', 'twse/2330'])
  • 1
  1. writer.add_embedding(mat, metadata=None, label_img=None, global_step=None, tag=‘default’, metadata_header=None)

- mat: torch.Tensor或者numpy.array,矩阵的每一行是data point的特征向量,维度:(N, D)N是data的数量,D是嵌入的维度
- metadata:标签列表,每个元素将转换为字符串
- label_img:torch.Tensor,对应每个data point的图像,维度:(N, C, H, W)
- global_step:记录步长
- tag:嵌入embedding的名字
- 可能出现的问题:module 'tensorflow_core._api.v2.io.gfile' has no attribute 'get_filesystem' python环境中同时安装了PyTorch和tensorflow,所以导致了在使用tensorboard时,是按tensorflow的api来查找的,因此就导致了上面这个问题
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
import keyword # python关键词
import torch
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter(log_dir="My_embedding", comment="_add_embedding")
meta = []
while len(meta) < 100:
     meta.extend(keyword.kwlist)
meta = meta[:100]
for i, v in enumerate(meta):
    meta[i] = v + str(i)

label_img = torch.rand(100, 3, 10, 32)
for i in range(100):
    label_img[i]*=i/100.0
    
# writer.add_embedding(torch.randn(100, 5), metadata=meta, label_img=label_img) # 出错了
writer.add_embedding(torch.randn(100, 5), label_img=label_img)
# writer.add_embedding(torch.randn(100, 5), metadata=meta)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  1. writer.add_figure(tag, figure, global_step=None, close=True, walltime=None) # 略
  2. writer.add_graph(model, input_to_model=None, verbose=False) # 略
  3. writer.add_histogram(tag, values, global_step=None, bins=‘tensorflow’, walltime=None, max_bins=None)

- tag: 字符串,数据名称
- values: 创建直方图的数值,类型为torch.Tensor, numpy.array, string/blobname
- global_step: 步长,整型
- bins:字符串,可为"tensorflow", "auto", "fd"...决定bins如何被创建
- walltime:可选覆盖默认walltime(time.time()) 事件发生后的秒数
  • 1
  • 2
  • 3
  • 4
  • 5
from torch.utils.tensorboard import SummaryWriter
import numpy as np

writer = SummaryWriter(filename_suffix="_pytorch")
for i in range(10):
    x = np.random.random(1000)
    writer.add_histogram('distribution centers', x + i, i)
writer.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. writer.add_histogram_raw(tag, min, max, num, sum, sum_squares, bucket_limits, bucket_counts, global_step=None, walltime=None)

- min: float or int
- max: float or int
- num: int,值的数量
- sum:float or int, 所有值的和
- sum_squares: float or int, 所有值的平方和
- bucket_limits: torch.Tensor 或者numpy.array,每个bucket的上界
- bucket_counts: torch.Tensor 或者numpy.array,每个bucket里值的数量
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
from torch.utils.tensorboard import SummaryWriter
import numpy as np

writer = SummaryWriter(comment="_add_histogram_raw")
dummy_data = []
for idx, value in enumerate(range(50)):
    dummy_data.extend([idx + 0.001] * value)

bins = list(range(50+2))
bins = np.array(bins)
values = np.array(dummy_data).astype(float).reshape(-1)
counts, limits = np.histogram(values, bins=bins)
sum_sq = values.dot(values) # 自身与自身的点积
writer.add_histogram_raw(
    tag='histogram_with_raw_data',
    min=values.min(),
    max=values.max(),
    num=len(values),
    sum=values.sum(),
    sum_squares=sum_sq,
    bucket_limits=limits[1:].tolist(),
    bucket_counts=counts.tolist(),
    global_step=0)
writer.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  1. writer.add_hparams(hparam_dict=None, metric_dict=None)

- tensorboard中进行超参数结果的对比
- hparam_dict: 字典中的每个键值对都是超参数的名称及其对应的值。
- metric_dict: 字典中的每个键/值对都是metric的名称及其对应的值。请注意,此处使用的key在tensorboard记录中应该是唯一的。否则,您在add_scalar中添加的值将显示在hparam插件中。在大多数情况下,这是不需要的。
  • 1
  • 2
  • 3
from torch.utils.tensorboard import SummaryWriter

with SummaryWriter() as w:
for i in range(5):
    w.add_hparams({'lr': 0.1*i, 'bsize': i},
                    {'hparam/accuracy': 10*i, 'hparam/loss': 10*i})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. writer.add_image(tag, img_tensor, global_step=None, walltime=None, dataformats=‘CHW’)

- img_tensor: torch.Tensor, numpy.array, string/blobname, 图像数据;维度:(3, H, W)
- 注:img_tensor的维度也可以是(1, H, W), (H, W), (H, W, 3),只要dataformats相应地改为'CHW', 'HW','HWC'
  • 1
  • 2
from torch.utils.tensorboard import SummaryWriter
import numpy as np

img = np.zeros((3, 100, 100))
img[0] = np.arange(0, 10000).reshape(100, 100) / 10000
img[1] = 1 - np.arange(0, 10000).reshape(100, 100) / 10000

img_HWC = np.zeros((100, 100, 3))
img_HWC[:, :, 0] = np.arange(0, 10000).reshape(100, 100) / 10000
img_HWC[:, :, 1] = 1 - np.arange(0, 10000).reshape(100, 100) / 10000

writer = SummaryWriter(comment='_add_image')
writer.add_image('my_image', img, 0)

# If you have non-default dimension setting, set the dataformats argument.
writer.add_image('my_image_HWC', img_HWC, 0, dataformats='HWC')
writer.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  1. writer.add_image_with_boxes(tag, img_tensor, box_tensor, global_step=None, walltime=None, rescale=1, dataformats=‘CHW’)

- img_tensor: 同上
- box_tensor: torch.Tensor, numpy.array, string/blobname, box数据(用于检测到的物体),维度:NX4,其中N是box的数量,行中的每4个元素代表(xmin,ymin,xmax,ymax)。
- rescale:Optional scale override
- dataformats:NCHW, NHWC, CHW, HWC, HW, WH, etc.
  • 1
  • 2
  • 3
  • 4
  1. writer.add_images(self, tag, img_tensor, global_step=None, walltime=None, dataformats=‘NCHW’)

- img_tensor: 同上, 维度:(N, 3, H, W),可根据dataformats改变
- dataformats: NCHW, NHWC, CHW, HWC, HW, WH, etc.
  • 1
  • 2
from torch.utils.tensorboard import SummaryWriter
import numpy as np

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

writer = SummaryWriter(comment="_add_images")
writer.add_images('my_image_batch', img_batch, 0)
writer.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. writer.add_mesh(tag, vertices, colors=None, faces=None, config_dict=None, global_step=None, walltime=None)

- 将网格或3D点云添加到TensorBoard。 可视化基于Three.js,因此它允许用户与渲染的对象进行交互。 除了顶点,面等基本定义外,用户还可以提供相机参数,照明条件等。
- vertices: torch.Tensor, 顶点的3D坐标列表。维度:(B, N, 3)对应(batch, num_of_vertices, channels)
- colors: torch.Tensor, 每个顶点的颜色。维度:(B, N, 3),对于“ uint8”类型,值应位于\[0,255\]中;对于“ float”类型,值应位于\[0,1\]中。
- faces: torch.Tensor, 每个三角形内的顶点的索引。(可选的)维度:(B, N, 3), 该值应位于类型'uint8'的\[0,number_of_vertices\]中。
- config_dict: 具有ThreeJS类名称和配置的字典。
  • 1
  • 2
  • 3
  • 4
  • 5
from torch.utils.tensorboard import SummaryWriter

vertices_tensor = torch.as_tensor([
    [1, 1, 1],
    [-1, -1, 1],
    [1, -1, -1],
    [-1, 1, -1],
], dtype=torch.float).unsqueeze(0)
colors_tensor = torch.as_tensor([
    [255, 0, 0],
    [0, 255, 0],
    [0, 0, 255],
    [255, 0, 255],
], dtype=torch.int).unsqueeze(0)
faces_tensor = torch.as_tensor([
    [0, 2, 3],
    [0, 3, 1],
    [0, 1, 2],
    [1, 3, 2],
], dtype=torch.int).unsqueeze(0)

writer = SummaryWriter(comment='_add_mesh')
writer.add_mesh('my_mesh', vertices=vertices_tensor, colors=colors_tensor, faces=faces_tensor)
writer.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  1. writer.add_onnx_graph(prototxt)

- 未知,查阅tensorboard文档
  • 1
  1. writer.add_pr_curve(tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None)

- 精度-召回率曲线
- 绘制精度-召回率曲线可让您了解模型的在不同阈值设置下的性能。通过此功能,您提供真实标签(T/F)和预测置信度(通常是模型的输出)。TensorBoard用户界面将让您以交互方式选择阈值。
- labels(torch.Tensor, numpy.array, string/blobname): 基本事实数据。 每个元素的二进制标签。
- predictions(torch.Tensor, numpy.array, or string/blobname): 元素被分类为true的概率, 值在\[0, 1\]
- num_thresholds (int):用于绘制曲线的阈值数。
- weights: 暂未知
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
from torch.utils.tensorboard import SummaryWriter
import numpy as np

labels = np.random.randint(2, size=100)  # binary label
predictions = np.random.rand(100)
writer = SummaryWriter(comment='_add_pr_curve')
writer.add_pr_curve('pr_curve', labels, predictions, 0)
writer.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. writer.add_pr_curve_raw(tag, true_positive_counts, false_positive_counts, true_negative_counts, false_negative_counts, precision, recall, global_step=None, num_thresholds=127, weights=None, walltime=None)

- 添加带有原始数据的精确召回曲线。
- true_positive_sounts(torch.Tensor, numpy.array, or string/blobname): 真正例计数
- false_positive_counts(torch.Tensor, numpy.array, or string/blobname): 假正例计数
- true_negative_counts(torch.Tensor, numpy.array, or string/blobname): 真负例计数
- false_negative_counts(torch.Tensor, numpy.array, or string/blobname): 假负例计数
- precision: 同上
- recall:同上
- num_thresholds: 同上
- see: https://github.com/tensorflow/tensorboard/blob/master/tensorboard/plugins/pr_curve/README.md
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. writer.add_scalar(tag, scalar_value, global_step=None, walltime=None)

- scalar_value (float or string/blobname): 要保存的值
  • 1
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter(comment="_add_scalar")
x = range(100)
for i in x:
    writer.add_scalar('y=2x', i * 2, i)
writer.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. writer.add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)

- 将标量数据添加到summary,该方法也会将数据保存在内存中,极端情况下会爆了内存
- main_tag (string): 标签的父级目录名
- tag_scalar_dict (dict): 存储标签和对应值的键值对
  • 1
  • 2
  • 3
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter(comment='_add_scalars')
r = 5
for i in range(100):
    writer.add_scalars('run_14h', {'xsinx':i*np.sin(i/r),
                                   'xcosx':i*np.cos(i/r),
                                   'tanx': np.tan(i/r)}, i)
writer.close()
# This call adds three values to the same scalar plot with the tag
# 'run_14h' in TensorBoard's scalar section.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. writer.add_text(tag, text_string, global_step=None, walltime=None)

- tag (string): Data identifier
- text_string (string): 保存的字符串
  • 1
  • 2
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter(comment='_add_text')

writer.add_text('lstm', 'This is an lstm', 0)
writer.add_text('rnn', 'This is an rnn', 10)

writer.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. writer.add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)

- 需要“moviepy”库
- vid_tensor (torch.Tensor): 视频数据,维度:(N, T, C, H, W). 对于“ uint8”类型,值应位于[0,255]中;对于“ float”类型,值应位于[0,1]中。
- fps (float or int): 每秒的帧数
  • 1
  • 2
  • 3
  1. writer的其他方法

- writer.close(): writer结束时调用
- writer.flush(): 调用此方法以确保所有未决事件均已写入磁盘。
- writer.get_logdir(): 返回将写入事件文件的目录。
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/308467
推荐阅读
相关标签
  

闽ICP备14008679号