当前位置:   article > 正文

pytorch-Tensorboard使用_tensboard

tensboard

内容来源:
详解PyTorch项目使用TensorboardX进行训练可视化
TORCH.UTILS.TENSORBOARD
在本地显示远程服务器的TensorboardX结果

1.安装

使用 pip 安装

pip install tensorboardX
  • 1

从源码安装

git clone https://github.com/lanpa/tensorboardX && cd tensorboardX && python setup.py install
  • 1

2.Tensboard使用

2.1.初始化 SummaryWriter

  • 使用指定路径保存日志:
summarywriter1 = SummaryWriter(%target_dir)
  • 1
  • 无参数,默认将使用路径runs/日期时间来保存日志
summarywriter2 = SummaryWriter()

  • 1
  • 2
  • 提供commen参数,使用路径runs/日期时间-comment保存日志文件
summarywriter3 = SummaryWriter(comment='experiment')
  • 1

一般来讲,我们对于每次实验新建一个路径不同的 SummaryWriter,也叫一个 run,如 runs/exp1runs/exp2
接下来,我们就可以调用 SummaryWriter 实例的各种add_something方法向日志中写入不同类型的数据了。

2.2.记录数字 (scalar)数据

add_scalar(tag, scalar_value, global_step=None, walltime=None)
  • 1

参数

  • tag (string): 数据名称,不同名称的数据使用不同曲线展示
  • scalar_value (float): 数字常量值
  • global_step (int, optional): 训练的 step
  • walltime (float, optional): 记录发生的时间,默认为 time.time()
    PyTorch scalar tensor,需要调用 .item()方法获取其数值。我们一般会使用add_scalar方法来记录训练过程的 loss、accuracy、learning rate 等数值的变化,直观地监控训练过程。
from torch.utils.tensorboard import SummaryWriter
import numpy as np

writer = SummaryWriter('runs/scalar_example')

for n_iter in range(100):
    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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

请添加图片描述
在一个路径为 runs/scalar_example 的 run 中分别写入了二次函数数据 quadratic 和指数函数数据 exponential,
在另一个路径为 runs/another_scalar_example 的 run 中写入名称相同但参数不同的二次函数和指数函数数据

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=i)


writer = SummaryWriter('runs/another_scalar_example')
for i in range(10):
    writer.add_scalar('quadratic', i**3, global_step=i)
    writer.add_scalar('exponential', 3**i, global_step=i)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

请添加图片描述

相同名称的量值被放在了同一张图表中展示,方便进行对比观察。同时,我们还可以在屏幕左侧的 runs 栏选择要查看哪些 run 的数据。

一次性添加多个数字数据可以使用add_scalars

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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

请添加图片描述

2.3.记录图片(image)数据

注意,该方法需要 pillow 库的支持。

add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')
  • 1

参数

  • tag ( string ):数据标识符
  • img_tensor ( torch.Tensor , numpy.array , or string/blobname ) :图像数据
  • global_step ( int ) :要记录的全局步长值
  • walltime ( float ) :可选覆盖默认 walltime (time.time()) 事件纪元后的秒数

形状
默认为 (3,H,W),可以使用torchvision.utils.make_grid()将一批张量转换为 3xHxW 格式或调用add_images并让我们完成这项工作。 (1, H, W),(H,W), (H,W,3) 的张量也适用,只要dataformats传递相应的参数,例如CHW, HWC, HW.

from tensorboardX import SummaryWriter
import cv2 as cv

writer = SummaryWriter('runs/image_example')
for i in range(1, 6):
    writer.add_image('countdown',
                     cv.cvtColor(cv.imread('{}.jpg'.format(i)), cv.COLOR_BGR2RGB),
                     global_step=i,
                     dataformats='HWC')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

使用 opencv 读入图片,opencv 读入的图片通道排列是 BGR,因此需要先转成 RGB 以保证颜色正确,并且 dataformats 设为 ‘HWC’,而非默认的 ‘CHW’。调用这个方法一定要保证数据的格式正确,像 PyTorch Tensor 的格式就是默认的 ‘CHW’。效果如下,可以拖动滑动条来查看不同 global_step 下的图片:
请添加图片描述
add_image方法只能一次插入一张图片。如果要一次性插入多张图片,有两种方法:

  • 使用 torchvision 中的 make_grid方法将多张图片拼合成一张图片后,再调用 add_image 方法。
  • 使用 SummaryWriter 的 ```add_images````方法
add_images(tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW')
  • 1

参数

  • tag ( string ):数据标识符
  • img_tensor ( torch.Tensor , numpy.array , or string/blobname ) :图像数据
  • global_step ( int ) :要记录的全局步长值
  • walltime ( float ) :可选覆盖默认 walltime (time.time()) 事件纪元后的秒数
  • dataformats ( string ):NCHW、NHWC、CHW、HWC、HW、WH 等形式的图像数据格式规范。
from torch.utils.tensorboard import SummaryWriter
import numpy as np

img_batch = np.zeros((16, 3, 100, 100))
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

请添加图片描述

2.4.添加直方图(histogram)数据

add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)
  • 1

参数

  • tag (string): 数据名称
  • values (torch.Tensor, numpy.array, or string/blobname): 用来构建直方图的数据
  • global_step (int, optional): 训练的 step
  • bins (string, optional): 取值有 ‘tensorflow’、‘auto’、‘fd’ 等, 该参数决定了分桶的方式,详见这里。
  • walltime (float, optional): 记录发生的时间,默认为 time.time()
  • max_bins (int, optional): 最大分桶数
    我们可以通过观察数据、训练参数、特征的直方图,了解到它们大致的分布情况,辅助神经网络的训练过程。
from tensorboardX import SummaryWriter
import numpy as np

writer = SummaryWriter('runs/embedding_example')
writer.add_histogram('normal_centered', np.random.normal(0, 1, 1000), global_step=1)
writer.add_histogram('normal_centered', np.random.normal(0, 2, 1000), global_step=50)
writer.add_histogram('normal_centered', np.random.normal(0, 3, 1000), global_step=100)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我们使用 numpy从不同方差的正态分布中进行采样。打开浏览器可视化界面后,我们会发现多出了"DISTRIBUTIONS"和"HISTOGRAMS"两栏,它们都是用来观察数据分布的。其中在"HISTOGRAMS"中,同一数据不同 step 时候的直方图可以上下错位排布 (OFFSET) 也可重叠排布 (OVERLAY)。上下两图分别为"DISTRIBUTIONS"界面和"HISTOGRAMS"界面。
请添加图片描述
请添加图片描述

2.5.添加神经结构图(graph)数据

add_graph(model, input_to_model=None, verbose=False, **kwargs)
  • 1

参数

  • model (torch.nn.Module): 待可视化的网络模型
  • input_to_model (torch.Tensor or list of torch.Tensor, optional): 待输入神经网络的变量或一组变量

该方法可以可视化神经网络模型
请添加图片描述

2.6.添加嵌入向量 (embedding)数据

add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='default', metadata_header=None)
  • 1

参数

  • mat (torch.Tensor or numpy.array): 一个矩阵,每行代表特征空间的一个数据点
  • metadata (list or torch.Tensor or numpy.array, optional): 一个一维列表,mat 中每行数据的 label,大小应和 mat 行数相同
  • label_img (torch.Tensor, optional): 一个形如 NxCxHxW 的张量,对应 mat 每一行数据显示出的图像,N 应和 mat 行数相同
  • global_step (int, optional): 训练的 step
  • tag (string, optional): 数据名称,不同名称的数据将分别展示
    add_embedding是一个很实用的方法,不仅可以将高维特征使用PCA、t-SNE等方法降维至二维平面或三维空间显示,还可观察每一个数据点在降维前的特征空间的K近邻情况。下面例子中我们取 MNIST 训练集中的 100 个数据,将图像展成一维向量直接作为 embedding,使用 TensorboardX 可视化出来
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,:],
    metadata=mnist.train_labels[:100],
    label_img = mnist.train_data[:100,:,:].reshape((-1, 1, 28, 28)).float() / 255,
    global_step=0
)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

采用 PCA 降维后在三维空间可视化效果如下:
请添加图片描述
可以发现,虽然还没有做任何特征提取的工作,但 MNIST 的数据已经呈现出聚类的效果,相同数字之间距离更近一些(有没有想到 KNN 分类器)。我们还可以点击左下方的 T-SNE,用 t-SNE 的方法进行可视化
add_embedding方法需要注意的几点:

  • mat 是二维 MxN,metadata 是一维 N,label_img 是四维 NxCxHxW!
  • label_img 记得归一化为 0-1 之间的 float 值

3.Tensboard的显示

3.1.直接在普通主机进行操作

  • 在Google Chrome下打开日志文件
  • 打开Anaconda Prompt,进入环境,然后进入到保存日志文件的盘,输入tensorboard --logdir=你所保存的文件夹名称,它会生成一个网址
  • 复制网址到Google Chrome即可打开

3.2.在本地显示服务器的tensorboardX结果的步骤(XShell)

  • 使用XShell建立连接,!其中源主机填127.0.0.1(表示本机),侦听端口可以任意设置一个未被占用的端口号,比如6007;目标主机表示本地服务器,目标端口为6007,即tensorboard设置的被监听的端口。
    请添加图片描述
    -连接。在服务器输入命令,如果-port设置为其他端口,上面目标主机的目标端口也应该发生相应的修改。
tensorboard --logdir=log_dir
  • 1
  • 服务器端显示:
    请添加图片描述
  • 复制链接到本地浏览器便可以成功访问tensorboard。
    http://localhost:6007
    浏览器端显示:
    请添加图片描述
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号