1 SummaryWriter
1.1 创建
首先,需要创建一个 SummaryWriter 的示例:
from tensorboardX import SummaryWriter
#以下是三种不同的初始化 SummaryWriter 的方法
writer1 = SummaryWriter('runs/exp')
#提供一个路径,将使用该路径来保存日志
writer2 = SummaryWriter()
#无参数,默认将使用 runs/日期时间 路径来保存日志
writer3 = SummaryWriter(comment='resnet')
#提供一个 comment 参数,将使用 runs/日期时间-comment 路径来保存日志
????????一般来讲,我们对于每次实验新建一个路径不同的 SummaryWriter,叫作一个 run,如 runs/exp1、runs/exp2。
1.2?可视化
????????接下来,我们就可以调用 SummaryWriter 实例的各种 add_something 方法向日志中写入不同类型的数据了。想要在浏览器中查看可视化这些数据,只要在命令行中开启 tensorboard 即可:
tensorboard --logdir=<your_log_dir>
????????其中的 <your_log_dir> 可以是单个 run 的路径,如上面 writer1 生成的 runs/exp;
???????? <your_log_dir> 也可以是多个 run 的父目录,如??runs/ ?下面可能会有很多的子文件夹,每个文件夹都代表了一次实验,我们令?--logdir=runs/ ?,就可以在 tensorboard 可视化界面中方便地横向比较?runs/ ?下不同次实验所得数据的差异。
2 使用add 记录数据
2.1 添加数字 add_scalar
记录数字常量。
2.1.1 基本使用方法
add_scalar(
tag,
scalar_value,
global_step=None,
walltime=None)
2.1.2 参数介绍
tag?(string) | 数据名称,不同名称的数据使用不同曲线展示 | scalar_value?(float) | 数字常量值 | global_step?(int, optional) | 训练的 step | walltime?(float, optional) | 记录发生的时间,默认为?time.time() |
2.1.3 举例
from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/scalar_example')
for i in range(10):
writer.add_scalar('quadratic', i**2, global_step=i)
writer.add_scalar('exponential', 2**i, global_step=1)
首先,在对应的路径出现了scalar_example 文件夹
?????????然后可视化之(这里我已经cd到runs的路径上了,所以使用的是相对路径。当然绝对路径也是可以的)
tensorboard --logdir=scalar_example
? ? ? ? 会出来一行这个:
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.7.0 at http://localhost:6006/ (Press CTRL+C to quit)
2.1.4 多个?writer
from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/example_test/scalar_example')
for i in range(10):
writer.add_scalar('quadratic', i**2, global_step=i)
writer.add_scalar('exponential', 2**i, global_step=i)
writer1 = SummaryWriter('runs/example_test/scalar_example1')
for i in range(10):
writer1.add_scalar('quadratic', i**3, global_step=i)
writer1.add_scalar('exponential', 3**i, global_step=i)
?2.1.5 add_scalar注意事项
????????这里的 scalar_value 一定是 float 类型。
????????如果是 PyTorch scalar tensor,则需要调用 .item() 方法获取其数值。
????????我们一般会使用 add_scalar 方法来记录训练过程的 loss、accuracy、learning rate 等数值的变化,直观地监控训练过程。 ?
2.2 add_histogram 添加直方图
2.2.1 使用方法
add_histogram(
tag,
values,
global_step=None,
bins='tensorflow',
walltime=None,
max_bins=None)
2.2.2 参数说明
tag?(string) | ?数据名称 | values?(torch.Tensor, numpy.array, or string): | 用来构建直方图的数据 | global_step?(int, optional) | 训练的 step | bins?(string, optional) | ?该参数决定了分桶的方式 具体见:numpy.histogram_bin_edges — NumPy v1.21 Manual | walltime?(float, optional) | 记录发生的时间,默认为?time.time() | max_bins?(int, optional) | 最大分桶数 |
2.2.3 使用举例
from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/embedding_example2')
writer.add_histogram(
'normal_centered5',
np.random.normal(0, 1, 1000),
global_step=1,
max_bins=100)
writer.add_histogram(
'normal_centered5',
np.random.normal(0, 2, 1000),
global_step=1,
max_bins=100)
writer.add_histogram(
'normal_centered5',
np.random.normal(0, 3, 1000),
global_step=1,
max_bins=100)
writer.add_histogram(
'normal_centered6',
np.random.normal(0, 1, 1000),
global_step=1,
max_bins=100)
writer.add_histogram(
'normal_centered6',
np.random.normal(0, 2, 1000),
global_step=5,
max_bins=100)
writer.add_histogram(
'normal_centered6',
np.random.normal(0, 3, 1000),
global_step=10,
max_bins=100)
在tensorboard的histograms里面有:(但我并没有弄明白这时候的global_step有什么作用。。。望评论区赐教)、
overlay
【global_step=1,1,1? VS global_step=1,5,10】
?offset
【global_step=1,1,1? VS global_step=1,5,10】
?2.3? add_graph 添加图
?使用?add_graph ?方法来可视化一个神经j
2.3.1 基本使用方法
add_graph(
model,
input_to_model=None,
verbose=False,
**kwargs)
?2.3.2 参数使用说明
model?(torch.nn.Module): | 待可视化的网络模型 | input_to_model?(torch.Tensor or list of torch.Tensor, optional) | ?待输入神经网络的变量或一组变量 |
2.3.3 使用举例?
pytorch笔记:VGG 16_UQI-LIUWJ的博客-CSDN博客
import torch, torchvision
model = torchvision.models.vgg16()
writer=SummaryWriter('graph')
writer.add_graph(model,torch.ones((1,3, 224, 224)))
?展开之后是
?随便点开一个block:
?
?2.4 add_embedding?
使用?add_embedding ?方法可以在二维或三维空间可视化 embedding 向量。
2.4.1 使用方法
add_embedding(
mat,
metadata=None,
label_img=None,
global_step=None,
tag='default',
metadata_header=None)
2.4.2 参数说明
mat?(torch.Tensor or numpy.array) | 一个矩阵,每行代表特征空间的一个数据点 | metadata?(list or torch.Tensor or numpy.array, optional) | 一个一维列表,mat 中每行数据的 label,大小应和 mat 行数相同 | global_step?(int, optional) | 训练的 step | label_img?(torch.Tensor, optional) | 一个形如 NxCxHxW 的张量,对应 mat 每一行数据显示出的图像,N 应和 mat 行数相同 | tag?(string, optional) | 数据名称,不同名称的数据将分别展示 |
2.4.3 举例
from tensorboardX import SummaryWriter
import torchvision
writer = SummaryWriter('runs/embedding_example')
mnist = torchvision.datasets.MNIST('mnist', download=True)
writer.add_embedding(
mnist.train_data.reshape((-1, 28 * 28))[:100,:],
#每一行是一个数据,前100个数据
metadata=mnist.train_labels[:100],
label_img = mnist.train_data[:100,:,:].reshape((-1, 1, 28, 28)).float() / 255,
global_step=0
)
?
?
2.4.4 作用
????????add_embedding 是一个很实用的方法,不仅可以将高维特征使用PCA、t-SNE等方法降维至二维平面或三维空间显示,还可观察每一个数据点在降维前的特征空间的K近邻情况。
? ? ? ? 上面的例子中我们取 MNIST 训练集中的 100 个数据,将图像展成一维向量直接作为 embedding,使用 TensorboardX 可视化出来。
2.4.5 注意事项
add_embedding ?方法需要注意的几点:
mat ?是二维 NxM,metadata ?是一维 N,label_img ?是四维 NxCxHxW!label_img ?记得归一化为 0-1 之间的 float 值
参考资料:
详解PyTorch项目使用TensorboardX进行训练可视化_浅度寺-CSDN博客_tensorboardx
|