你是否有这样的疑惑?在我们完成深度学习项目工程中,很多时候我们自己构建模型结构,或者在学习深度学习算法的时候,由于算法结构过于复杂,很难充分理解模型结构层次。你是否想看到自己的模型训练指标与参数的变化情况。很多时候,我们自己构建完成训练后,需要在通过修改参数来评估模型的好坏,同时还需要对相应的指标进行可视化,这样是不是有些麻烦。
它来了!!!TensorBoard是一款神奇的可视化辅助工具,它能够很好的和pytorch进行配合
在炼丹的时候,经常需要追踪模型在训练过程中性能的变化,例如:Regression任务中的MSE、分类任务中的准确率、生成(图片)任务中图片的生成质量、此外还有合成语音的质量……
大体上来说,所有需要追踪的数据包括:标量(scalar)、图像(image)、统计图(diagram)、视频(video)、音频(audio)、文本(text)、Embedding等等
除了有大量的数据需要追踪外,我们还需要很好的把这些数据显示出来,即数据的写入和显示(读取)要有异步IO,有的时候服务器在学校的机房托管,因此还需要能够通过内网提供可视化……
因此,在种种需求之下,使用一个网页程序来帮助我们进行数据的追踪就成了一个很好的解决方案。具体来说,网页程序实现了前后端的分离,后端只需要专注于数据的记录,而前端专注于数据的显示。此外,网页程序可以进一步扩展,提供网络服务。
因此,就有了TensorBoard这个网页程序实现了我们上面的需求。TensorBoard最早是TensorFlow中的模块,不过现在经过Pytorch团队的努力,TensorBoard已经集成到了Pytorch中。
在pytorch可视化工具——TensorBoard中主要可以使用到的函数有
add_scalar(tag, scalar_value, global_step=None, walltime=None)
add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)
add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None)
add_image(tag, img_tensor, global_step=None, walltime=None)
add_graph(model, input_to_model=None, verbose=False, **kwargs)
add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='de fault', metadata_header=None)
下面将会对函数的具体使用进行详细的介绍操作。
这个函数用于创建一个tensorboard文件,其中常用参数有:
log_dir (str):指定了数据保存的文件夹的位置,如果该文件夹不存在则会创建一个出来。如果没有指定的话,默认的保存的文件夹是./runs/现在的时间_主机名,例如:Feb04_22-42-47_Alienware,因此每次运行之后都会创建一个新的文件夹。在写论文的时候我们会涉及一系列实验,从不同的角度来说明一些问题,例如我们的假设是否正确、模型性能是否更好……因此最好不要用默认的实现来直接作为存放数据的文件夹,而是使用具有含义的二级结构,例如:runs/exp1。这样的话,所有的实验1的数据都在这个文件夹下,这样我们就可以方便的进行比较。
comment (string):给默认的log_dir添加的后缀,如果我们已经指定了log_dir具体的值,那么这个参数就不会有任何的效果
purge_step (int):TensorBoard在记录数据的时候有可能会崩溃,例如在某一个epoch中,进行到第 T + X T+X T+X个step的时候由于各种原因(内存溢出)导致崩溃,那么当服务重启之后,就会从 T T T个step重新开始将数据写入文件,而中间的 X X X,即purge_step指定的step内的数据都被被丢弃。
max_queue (int):在记录数据的时候,在内存中开的队列的长度,当队列慢了之后就会把数据写入磁盘(文件)中。
flush_secs (int):以秒为单位的写入磁盘的间隔,默认是120秒,即两分钟。
filename_suffix (string):添加到log_dir中每个文件的后缀。更多文件名称设置要参考tensorboard.summary.writer.event_file_writer.EventFileWriter类。
在书写代码的时候我的个人习惯是设置指定的文件保存路径,所以我的个人书写习惯如下。
log_dir="./train_log/test_log_dir"#设置文件的保存路径
writer = SummaryWriter(log_dir=log_dir)
常用的头文件如下:
import torchvision.models as models
import torch
from torch.utils.tensorboard import SummaryWriter
import numpy as np
import matplotlib.pyplot as plt
tensorboard启动命令
tensorboard --logdir "./"
add_scalar(tag, scalar_value, global_step=None,walltime=None)
例子1:
from torch.utils.tensorboard import SummaryWriter
import numpy as np
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
for x in range(1, 101) :
writer.add_scalar('y = 2x', x, 2 * x)
writer.close()
add_scalars(main_tag, tag_scalar_dict,global_step=None, walltime=None)
案列:
from torch.utils.tensorboard import SummaryWriter
import numpy as np
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
r = 5
for x in range(1, 101) :
writer.add_scalars('run_14h', {'xsinx' : x * np.sin(x / r),
'xcosx' : x * np.cos(x / r),
'xtanx' : x * np.tan(x / r)}, x)
writer.close()
案例2:
#coding = utf-8
from torch.utils.tensorboard import SummaryWriter
import numpy as np
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
train_loss = [3.5,2.0,2.5,2.0]
dev_loss = [3.0,2.0,2.5,2.0]
for i in range(len(train_loss)):
writer.add_scalars("loss",{"train":train_loss[i],"dev":dev_loss[i]},i+1)
for n_iter in range(100):
writer.add_scalars('data',
{"xsinx": n_iter * np.sin(n_iter),
"xcosx": n_iter * np.cos(n_iter),
"arctanx": np.arctan(n_iter)},
n_iter)
writer.close()
add_histogram(tag, values, global_step=None,bins='tensorflow', walltime=None)
绘制直方图和多分位数折线图,常用于监测权值及梯度的分布变化情况,便于诊断网 络更新方向是否正确。
• tag:图像的标签名,图的唯一标识
• values:要统计的参数
• global_step:y轴
• bins:取直方图的bins
from torch.utils.tensorboard import SummaryWriter
import numpy as np
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
for step in range(10) :
x = np.random.randn(1000)
writer.add_histogram('distribution of gaussion', x, step)
writer.close()
x 轴即变量大小, y 轴为 gloabl_step。 377 表示卷积层 conv1 的权值中有 377 个 weight 的大小是在 0. 036 这个区间。
绘制图片,可用于检查模型的输入,监测 feature map 的变化,或是观察 weight。
add_image(tag, img_tensor, global_step=None,walltime=None, dataformats='CHW')
• tag:图像的标签名,图的唯一标识
• img_tensor:图像数据,注意尺度
• global_step:x轴
• dataformats:数据形式,CHW,HWC,HW
from torch.utils.tensorboard import SummaryWriter
import numpy as np
import cv2 as cv
import torch
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
img = cv.imread('test1.jpg', cv.IMREAD_COLOR)#输入图像要是3通道的,所以读取彩色图像
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
img = torch.tensor(img.transpose(2, 0, 1))#cv读取为numpy图像为(H * W * C),所以要进行轴转换
writer.add_image('zhou_ge', img, 0)
writer.close()
make_grid(tensor, nrow=8, padding=2,normalize=False, range=None, scale_each=False,pad_value=0)
• tensor:图像数据, B*C*H*W形式
• nrow:行数(列数自动计算)
• padding:图像间距(像素单位)
• normalize:是否将像素值标准化
• range:标准化范围
• scale_each:是否单张图维度标准化
• pad_value:padding的像素值
add_graph(model, input_to_model=None, verbose=False)
• model:模型,必须是 nn.Module
• input_to_model:输出给模型的数据
• verbose:是否打印计算图结构信息
from torch.utils.tensorboard import SummaryWriter
import numpy as np
import torch
import torch.nn as nn
log_dir="./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir)
class MLP(nn.Module) :
def __init__(self):
super(MLP, self).__init__()
self.Net = nn.Sequential(
nn.Linear(784, 512),
nn.ReLU(),
nn.Linear(512, 128),
nn.ReLU(),
nn.Linear(128, 10)
)
def forward(self, input):
input = input.view(-1, 28 * 28)
return self.Net(input)
model = MLP()
input = torch.FloatTensor(np.random.rand(32, 1, 28, 28))
writer.add_graph(model, input)
writer.close()
summary(model, input_size, batch_size=-1,device="cuda")
• model:pytorch模型
• input_size:模型输入size
• batch_size:batch size
• device:“cuda” or “cpu”
神经网络学习小记录49——Pytorch当中Tensorboard的使用_Bubbliiiing的博客-CSDN博客_writer.add_graph
Pytorch中使用TensorBoard_鸿神的博客-CSDN博客_pytorch使用tensorboard
pytorch使用——(十三)TensorBoard_我学数学我骄傲的博客-CSDN博客
Pytorch深度学习——Tensorboard的使用_麓山南麓的博客-CSDN博客_tensorboard使用
详解Tensorboard及使用教程_八岁爱玩耍的博客-CSDN博客_tensorboard