torch.utils.tensorboard使用记录
- 初始化
- SummaryWriter常用的几种功能方法
- 记录标量/添加标量
- 一次记录多种标签/标量值
- 添加图片数据,需要pillow包
- 添加批量图片
- 添加文本数据
- 添加模型结构数据
- 添加pr曲线
- 添加超参数
- 可视化界面启动
初始化
torch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment=‘’, purge_step=None, max_queue=10, flush_secs=120, filename_suffix=‘’)
- init(log_dir=None, comment=‘’, purge_step=None, max_queue=10, flush_secs=120, filename_suffix=‘’)
- log_dir(str)–文件保存路径;使用默认进行项目记录时,生成的路径名为runs/CurrentDatetime+HOSRTNAME(当前时间+设备名称),在每次run时都会自动改变。使用分层的文件夹可以较好的记录不同实现,如指定runs/exp1,runs/exp2,这两个目录可以很好的把不同实验分开
- comment(str)–如果没有指定log_dir,其会作为后缀附加到默认路径名后面,如果指定了log_dir,其会失效
- purge_step(int)–TensorBoard在记录数据的时候有可能会崩溃,例如在某一个epoch中,进行到第T + X个step的时候由于各种原因(内存溢出)导致崩溃,那么当服务重启之后,就会从T 个step重新开始将数据写入文件,而中间的X,即purge_step指定的step内的数据都被丢弃
- max_queue(int)–在记录数据的时候,在内存中开的队列的长度,当队列慢了之后就会把数据写入磁盘(文件)中
- flush_secs(int)–以秒为单位的写入磁盘的间隔,默认是120秒,即两分钟
- filename_suffix(str)–添加到log_dir中每个文件的后缀。更多文件名称设置要参考tensorboard.summary.writer.event_file_writer.EventFileWriter类
代码案例:
from torch.utils.tensorboard import SummaryWriter
# create a summary writer with automatically generated folder name.
writer = SummaryWriter() # 默认方法,不传参数
# folder location: runs/May04_22-14-54_s-MacBook-Pro.local/
# create a summary writer using the specified folder name.
writer = SummaryWriter("my_experiment") # 相当于把前面说的runs替换为指定的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/
SummaryWriter常用的几种功能方法
记录标量/添加标量
add_scalar(tag, scalar_value, global_step=None, walltime=None, new_style=False, double_precision=False)
- tag(str)–用于给数据进行分类的标签,标签中可以包含父级和子级标签。例如给训练的loss以loss/train的tag,而给验证以loss/val的tag,这样的话,最终的效果就是训练的loss和验证的loss都被分到loss这个父级标签下。而train和val则是具体用于区分两个参数的标识符(identifier)。此外,只支持到二级标签
- scalar_value(float or string/blobname)–需要记录或保存的参数值/标量
- global_step(int)–首先,每个epoch中我们都会更新固定的step。因此,在一个数据被加入的时候,有两种step,第一种step是数据被加入时当前epoch已经进行了多少个step,第二种step是数据被加入时候,累计(包括之前的epoch)已经进行了多少个step。而考虑到我们在绘图的时候往往是需要观察所有的step下的数据的变化,因此global_step指的就是当前数据被加入的时候已经计算了多少个step。计算global_step的步骤很简单,就是global_step = epoch ∗ len(dataloader) + current_step
- new_style(boolean)–是使用新样式(张量字段)还是旧样式(simple_value 字段)。新样式可能会导致更快的数据加载
代码案例:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
x = range(100)
for i in x:
writer.add_scalar('y=2x', i * 2, i) # 此处的i就时global_step
writer.close() # 关闭
一次记录多种标签/标量值
add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)
- mian_tag(string)–所有要记录的标签的父名称
- tag_scalar_dict(dict)–多个表情名和对应的值组成的标量字典,key是记录的表明的名称,value是对应标量每个step的值
- global_step(int)–如上述
- walltime(float)–从SummaryWriter实例化开始到当前数据被加入时候所经历时间(以秒计算),默认是使用time.time()来自动计算的,当然我们也可以指定这个参数来进行修改。这个参数一般不改
代码案例:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
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.
添加图片数据,需要pillow包
add_image(tag, img_tensor, global_step=None, walltime=None, dataformats=‘CHW’)
- tag(string)–如上述
- img_tensor(torch.Tensor, numpy.array, or string/blobname)–需要记录的图片的数据
- shape:默认是(3, H, W)。可以使用torchvision.utils.make_grid()将一批张量转换为3xHxW 格式或调用add_images。具有 (1, H, W), (H,W), (H, W, 3) 的张量也适用,只要设置对应的数据格式参数即可例如CHW,HWC,HW。 - global_step(int)–如上述
- walltime(float)–如上述
- dataformats(str)–表格的图像数据格式规范,如CHW, HWC, HW, WH等,默认是CHW
代码案例:
from torch.utils.tensorboard import SummaryWriter
import numpy as np
img = np.zeros((3, 100, 100)) # 默认格式,CHW
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)) # 非默认格式,HWC
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()
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') # 非默认格式要设置dataformats为对应格式
writer.close()
添加批量图片
add_images(tag, img_tensor, global_step=None, walltime=None, dataformats=‘NCHW’)
- tag(string)–如上述
- img_tensor(torch.Tensor, numpy.array, or string/blobname)–需要记录的图片的数据
- shape:默认是(N,3, H, W)。当传入数据为非默认形状时,需要将dataformats设置为对应的格式 - global_step(int)–如上述
- walltime(float)–如上述
- dataformats(str)–表格的图像数据格式规范,如NCHW, NHWC, CHW, WH等,默认是NCHW
代码案例:
from torch.utils.tensorboard import SummaryWriter
import numpy as np
img_batch = np.zeros((16, 3, 100, 100)) # 生成了默认格式(N,3, H, W)的图片数据
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()
writer.add_images('my_image_batch', img_batch, 0) # 添加批量图片
writer.close()
添加文本数据
add_text(tag, text_string, global_step=None, walltime=None)
- tag(str)–如上述
- text_string(str)–需要记录的文本字符串
- global_step(int)–如上述
- walltime(float)–如上述
代码案例:
writer.add_text('lstm', 'This is an lstm', 0)
writer.add_text('rnn', 'This is an rnn', 10)
添加模型结构数据
add_graph(model, input_to_model=None, verbose=False, use_strict_trace=True)
- model(torch.nn.Module)–需要绘制的模型,必须是继承nn.Module的模型
- input_to_model(torch.Tensor or list of torch.Tensor)–待输入神经网络的变量或一组变量。输入的是一个元组,且各变量的维度一定要满足网络的实际输入需求,因为网络的输入变量个数大于等于1
- verbose(bool)–是否在控制台打印图形结构
- use_strict_trace(bool)–是否将关键字参数严格传递给 torch.jit.trace。当您希望跟踪器记录您的可变容器类型(列表、字典)时,传递 False
添加pr曲线
添加精确召回曲线。绘制精确召回曲线可让您了解模型在不同阈值设置下的性能。使用此功能,您可以为每个目标提供真实标记 (T/F) 和预测置信度(通常是模型的输出)。 TensorBoard UI 将让您以交互方式选择阈值。
add_pr_curve(tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None)
- tag(str)–如上述
- labels(torch.Tensor, numpy.array, or string/blobname)–真实labels。每个元素的二元标签。
- predictions(torch.Tensor, numpy.array, or string/blobname)–元素被分类为真的概率。值应该在 [0, 1]
- global_step(int)–如上述
- num_thresholds(int)–用于绘制曲线的阈值数
- walltime(float)–如上述
代码案例:
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()
writer.add_pr_curve('pr_curve', labels, predictions, 0)
writer.close()
添加超参数
add_hparams(hparam_dict, metric_dict, hparam_domain_discrete=None, run_name=None)
- hparam_dict(dict)–存放超参数的字典,字典中的每个键值对都是超参数的名称及其对应的值。值的类型可以是 bool、string、float、int 或 None 之一。
- metric_dict(dict)–字典中的每个键值对都是度量的名称及其对应的值。注意这里使用的键在tensorboard记录中应该是唯一的。否则,您通过 add_scalar 添加的值将显示在 hparam 插件中。在大多数情况下,这是不需要的。
- hparam_domain_discrete(Optional[Dict[str, List[Any]]])–包含超参数名称和它们可以保存的所有离散值的字典
- run_name(str)–运行的名称,作为 logdir 的一部分包含。如果未指定,将使用当前时间戳
代码案例:
from torch.utils.tensorboard import SummaryWriter
with SummaryWriter() as w:
for i in range(5): # 每次超参数随着i变化
w.add_hparams({'lr': 0.1*i, 'bsize': i},
{'hparam/accuracy': 10*i, 'hparam/loss': 10*i})
对于add_hparams,最好是在模型完成训练时,使用模型对训练集、验证集、测试集计算完accuracy、loss等metric后再将本次训练的有些超参数一起保存,并且此处的metric中的名称要与前面add_scalar中的不同
可视化界面启动
在算法训练完毕后,会在项目目录下生成在初始化中指定的log_dir的路径,在终端输入tensorboard --logdir=路径名,用浏览器访问http://127.0.0.1:6006即可进入可视化界面
tensorboard会在你指定的这个log-dir里面做路径搜索,寻找所有的events文件以及子文件夹中的events文件。路径相同的events文件可视化的图形线条颜色一样,如果文件路径不同但是数据名称相同,则会被用不同线条颜色画到同一个图里面。
pytorch官方文档连接https://pytorch.org/docs/stable/tensorboard.html,其中还有很多其他的方法