pytorch 笔记:tensorboardX
Posted UQI-LIUWJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch 笔记:tensorboardX相关的知识,希望对你有一定的参考价值。
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) | 该参数决定了分桶的方式 |
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的主要内容,如果未能解决你的问题,请参考以下文章
Pytorch使用tensorboardX可视化。超详细!!!
Pytorch使用tensorboardX网络结构可视化。超详细!!!
pytorch tensorboardX可视化问题:AttributeError: 'torch._C.Value' object has no attribute 'debu