相比于visdom,tensorborad对结果可视化集成的更好,界面相对更为美观,内容更为丰富,实现过程也更为简单。
1. Tensorboard面板介绍:
2. 使用tensorboard记录结果
直接上代码,这部分内容参考了torch.utils.tensorborad文档内容(torch.utils.tensorboard — PyTorch 1.10.0 documentation)
import numpy as np
import torch
from torch import nn
# 导入tensorboard写入器
from torch.utils.tensorboard import SummaryWriter
# 使用SummaryWriter实例化tensorboard
# 如果SummaryWriter里面给出路径, tensorboard就会创建对应的路径, 用于储存记录的结果
# 如果SummaryWriter里面给出路径, tensorboard就会创建默认文件夹runs用于储存结果
# 使用该实例化的对象writer即可实现将所记录的对象添加到tensorboard记录的结果中
writer = SummaryWriter('./path/to/the/folder2')
for n_iter in range(100):
# writer.add_scalar函数用于添加标量值
# add_scalar(tags, scalar_value, global_stop)
# tags: string, 记录对象的标签
# scalar_valud: float, 记录的数值
# global_step: int, x轴的数值
writer.add_scalar('Loss/train', np.random.random(), n_iter)
writer.add_scalar('Loss/test', np.random.random(), n_iter)
writer.add_scalar('Accuracy/train', np.random.random(), n_iter)
writer.add_scalar('Accuracy/test', np.random.random(), n_iter)
#############################################
# writer.add_scalars(main_tag, tag_scalar_dict, global_step=None)
# 该函数用于将多个scalar添加到同一个图中
# main_tag: string, 父标签
# tag_scalar_dict: dict, 将多个scalar组合在一起的字典对象,
# 该字典的key表示tag, value为记录的scalar值
# global_step: int, 图片的x轴
#############################################
# 该函数可以同时比较train, valid的Loss和评价指标的变化, 更有助于判断模型的训练情况
for i in range(100):
writer.add_scalars(
'run_14h', {
'xsinx':i*np.sin(i/5),
'xcosx':i*np.cos(i/5),
'tanx': np.tan(i/5)
}, i
)
#############################################
# writer.add_histogram(tag, values, global_step=None)
# 该函数用于记录直方图
# tag: string, 标签
# values: (torch.Tensor, numpy.array), 用于绘制直方图的值
# global_step: int, x轴取值
#############################################
# 该函数可以用于记录训练过程中, 模型weight和bias取值的分布情况
for i in range(10):
x = np.random.random(1000)
writer.add_histogram('distribution centers', x + i, i)
#############################################
# writer.add_image(tag, image_tensor, global_step=None)
# 该函数用于记录图片image, 需要注意的是, 当使用该函数的时候, 需要用到pillow包
# tag: string, 标签
# img_tensor: (torch.Tensor, numpy.array), shape=(3, H, W), 图片的像素值
# global_step: int, x轴取值
#############################################
# 该函数可用于实现模型训练过程中的图片特征的可视化
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.add_image('my_image', img, 0)
writer.add_image('my_image_HWC', img_HWC, 0, dataformats='HWC')
#############################################
# writer.add_text(tag, text_string, global_step=None)
# 该函数用于记录文本字符串
# tag: string, 标签
# text_string: string, 需要记录的文本
# global_step: int, x轴取值
#############################################
# 该函数应该主要用于文本分析的任务
writer.add_text('LSTM', 'This is an lstm', 0)
#############################################
# writer.add_graph(
# model, input_to_model=None, verbose=False, use_strict_trace=True
# )
# 该函数用于记录graph数据
# model: torch.nn.Module, 需要绘制的model
# input_to_model: (torch.Tensor, list of torch.Tensor), model的输入
# verbose: bool, 是否在控制面板上打印graph的结构
# use_strict_trace: bool,
#############################################
# 该函数应该主要用于文本分析的任务
class MyModel(nn.Module):
"""
简单的MLP
"""
def __init__(self):
super(MyModel, self).__init__()
self.layers = nn.Sequential(
nn.Linear(5, 3),
nn.ReLU(True),
nn.Linear(3, 2),
nn.ReLU(True)
)
def forward(self, x):
return self.layers(x)
mymodel = MyModel()
X = torch.randn(10, 5)
writer.add_graph(mymodel, X)
# 关闭writer
writer.close()
3. 命令行启动tensorboard用于可视化结果
在命令行输入如下命令:
tensorboard --logdir logpath --port 6069
# --logdir 后面跟的是tensorboard记录对象的储存路径, 该路径下可以有多个tensorboard储存结果
# --port 后面跟的是端口
然后就可以在http://localhost:6069/中查看tensorboard记录的结果。