TensorboardX和Visdom的使用

Tensorboard

官方文档
Tensorboard可视化用到pytorch的解决方案github链接
参考博客
参考博客

tensorboardX支持的可视化类型:

scalar, image, figure, histogram, audio, text, graph, onnx_graph, embedding, pr_curve and video summaries.

一些版本要求:

requirement for demo_graph.py is tensorboardX>=1.2 and pytorch>=0.4

安装

pip install tensorflow
pip install tensorboardX

目录修改
SummaryWriter()的参数为:def __init__(self, log_dir=None, comment='', **kwargs):其中log_dir为生成的文件所放的目录,comment为文件名称。默认目录为生成runs文件夹目录。

生成Images
使用torchvision.utils.make_grid先把多张图片转换成网格图,然后再调用add_image方法。

生成Graph
可以得到神经网络结构内部构造

with SummaryWriter(comment='Net1')as w:
         w.add_graph(model, (dummy_input,))
         

其中使用了python的上下文管理,with 语句,可以避免因w.close未写造成的问题。推荐使用此方式。

使用

  1. 在runs同级目录下使用命令行:
    tensorboard --logdir runs
    
    SummaryWriter(log_dir='scalar')的log_dir的参数值 存在时,将tensorboard --logdir runs 改为 tensorboard --logdir 参数值。
  2. 在本地浏览器中输入:https://localhost:6006

远程访问tensorboard,当程序在服务器上跑时,如何在本地浏览器打开tensorboard

  1. 将远程服务器的6006端口重定向到本地服务器上来
    在本地运行下面command
ssh -L 16006:127.0.0.1:6006 [email protected]
  1. 在服务器端runs同级目录下使用命令行:
tensorboard --logdir runs
  1. 最后,在本地访问地址:http://127.0.0.1:16006/

github给的官方实例

# demo.py

import torch
import torchvision.utils as vutils
import numpy as np
import torchvision.models as models
from torchvision import datasets
from tensorboardX import SummaryWriter

resnet18 = models.resnet18(False)
writer = SummaryWriter()
sample_rate = 44100
freqs = [262, 294, 330, 349, 392, 440, 440, 440, 440, 440, 440]

for n_iter in range(100):

    dummy_s1 = torch.rand(1)
    dummy_s2 = torch.rand(1)
    # data grouping by `slash`
    writer.add_scalar('data/scalar1', dummy_s1[0], n_iter)
    writer.add_scalar('data/scalar2', dummy_s2[0], n_iter)

    writer.add_scalars('data/scalar_group', {'xsinx': n_iter * np.sin(n_iter),
                                             'xcosx': n_iter * np.cos(n_iter),
                                             'arctanx': np.arctan(n_iter)}, n_iter)

    dummy_img = torch.rand(32, 3, 64, 64)  # output from network
    if n_iter % 10 == 0:
        x = vutils.make_grid(dummy_img, normalize=True, scale_each=True)
        writer.add_image('Image', x, n_iter)

        dummy_audio = torch.zeros(sample_rate * 2)
        for i in range(x.size(0)):
            # amplitude of sound should in [-1, 1]
            dummy_audio[i] = np.cos(freqs[n_iter // 10] * np.pi * float(i) / float(sample_rate))
        writer.add_audio('myAudio', dummy_audio, n_iter, sample_rate=sample_rate)

        writer.add_text('Text', 'text logged at step:' + str(n_iter), n_iter)

        for name, param in resnet18.named_parameters():
            writer.add_histogram(name, param.clone().cpu().data.numpy(), n_iter)

        # needs tensorboard 0.4RC or later
        writer.add_pr_curve('xoxo', np.random.randint(2, size=100), np.random.rand(100), n_iter)

dataset = datasets.MNIST('mnist', train=False, download=True)
images = dataset.test_data[:100].float()
label = dataset.test_labels[:100]

features = images.view(100, 784)
writer.add_embedding(features, metadata=label, label_img=images.unsqueeze(1))

# export scalar data to JSON for external processing
writer.export_scalars_to_json("./all_scalars.json")
writer.close()

可能出现的问题

ERROR:tensorflow:Tried to connect to port 6006, but address is in use. Tried to connect to port 6006, but address is in use.
解决方法:top查看占用端口的PID,kill掉。
输入命令:lsof -i:6006
得到结果:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Xvnc4 4969 amax 0u IPv4 655595 0t0 TCP *:x11-6 (LISTEN)
输入命令:kill -9 4969
每次得到的数字可能不同,再次运行就能解决。

TypeError: Cannot handle this data type
参考链接

这种多半是图片的维度出现了问题,在pytorch中tensor默认是CHW,而PIL中是HWC,因此需要使用.transpose(1,2,0)来将维度进行转换。

Visdom

参考链接

pytorch Visdom可视化,是一个灵活的工具,用于创建,组织和共享实时丰富数据的可视化。支持Torch和Numpy。

安装步骤

pip install visdom

启动服务器

python -m visdom.server
python3 -m visdom.server

这里用哪种python取决于你是用pip还是pip3安装的visdom。
现在可以通过访问http://localhost:8097或者127.0.0.1:8097浏览器访问Visdom ,或者指定您自己的主机地址。

远程使用Visodom
参考链接

  1. 连接ssh时,将服务器的8097端口重定向到自己机器上来:
    ssh -L 18097:127.0.0.1:8097 username@remote_server_ip
    其中:18097:127.0.0.1代表自己机器上的18097号端口,8097是服务器上visdom使用的端口。
  2. 在服务器上使用8097端口正常启动tensorboard:
    python -m visdom.server
  3. 在本地浏览器中输入地址:
    127.0.0.1:18097

Loss函数的可视化
参考链接

from visual_loss import Visualizer
from torchnet import meter
#用 torchnet来存放损失函数,如果没有,请安装
#示例
vis = Visualizer(env='my_wind')#为了可视化增加的内容
loss_meter = meter.AverageValueMeter()#为了可视化增加的内容
for epoch in range(10):
    loss_meter.reset()#为了可视化增加的内容
    loss_meter.add(epoch)#假设loss=epoch
    vis.plot_many_stack({'train_loss': loss_meter.value()[0]})#为了可视化增加的内容 
    #如果还想同时显示test loss,如法炮制,并用字典的形式赋值,如下。还可以同时显示train和test accuracy
    #vis.plot_many_stack({'train_loss': loss_meter.value()[0],'test_loss':test_loss_meter.value()[0]})#为了可视化增加的内容

运行python程序

import visdom
vis = visdom.Visdom()

trace = dict(x=[1, 2, 3], y=[4, 5, 6], mode="markers+lines", type='custom',
             marker={'color': 'red', 'symbol': 104, 'size': "10"},
             text=["one", "two", "three"], name='1st Trace')
layout = dict(title="First Plot", xaxis={'title': 'x1'}, yaxis={'title': 'x2'})

vis._send({'data': [trace], 'layout': layout, 'win': 'mywin'})

在网页中选择Environment
默认为main,可以自己设置vis = visdom.Visdom(env='test1')

vis作为一个客户端对象,可以使用常见的画图函数,包括:

  • line:类似Matlab中的plot操作,用于记录某些标量的变化,如损失、准确率等
  • image:可视化图片,可以是输入的图片,也可以是GAN生成的图片,还可以是卷积核的信息
  • images:图像列表
  • text:用于记录日志等文字信息,支持html格式
  • histgram:可视化分布,主要是查看数据、参数的分布
  • scatter:绘制散点图2D或3D
  • bar:绘制柱状图
  • pie:绘制饼状图
  • updateTrace:更新现有的线/散点图
  • 更多操作可参考visdom的github主页

Visdom中有两个重要概念:

  • env:环境。不同环境的可视化结果相互隔离,互不影响,在使用时如果不指定env,默认使用main。不同用户、不同程序一般使用不同的env。
  • pane:窗格。窗格可用于可视化图像、数值或打印文本等,其可以拖动、缩放、保存和关闭。一个程序中可使用同一个env中的不同pane,每个pane可视化或记录某一信息。

Visdom同时支持PyTorch的tensor和Numpy的ndarray两种数据结构,但不支持Python的int、float等类型,因此每次传入时都需先将数据转成ndarray或tensor

  • win:用于指定pane的名字,如果不指定,visdom将自动分配一个新的pane。如果两次操作指定的win名字一样,新的操作将覆盖当前pane的内容,因此建议每次操作都重新指定win。
  • opts:选项,接收一个字典,常见的option包括titlexlabelylabelwidth等,主要用于设置pane的显示格式。

简单的实例

import torch
import visdom
vis = visdom.Visdom(env='test1')
x = torch.arange(1,30,0.01)
y = torch.sin(x)
vis.line(X=x,Y=y,win='sinx',opts={'title':'y=sin(x)'})
 
# append 追加数据
for ii in range(0, 10):
    # y = x
    x = torch.Tensor([ii])
    y = x
    vis.line(X=x, Y=y, win='polynomial', update='append' if ii > 0 else None)
 
# updateTrace 新增一条线
x = torch.arange(0, 9, 0.1)
y = (x ** 2) / 9
vis.line(X=x, Y=y, win='polynomial', name='this is a new Trace')
 
# 可视化一个随机的黑白图片
#vis.image(torch.randn(64, 64).numpy())
 
# 随机可视化一张彩色图片
vis.image(torch.randn(3, 64, 64).numpy(), win='random2')
 
# 可视化36张随机的彩色图片,每一行6张
vis.images(torch.randn(36, 3, 64, 64).numpy(), nrow=6, win='random3', opts={'title':'random_imgs'})
 
vis.text(u'''

Hello Visdom


Visdom是Facebook专门为PyTorch开发的一个可视化工具, 在内部使用了很久,在2017年3月份开源了它。 Visdom十分轻量级,但是却有十分强大的功能,支持几乎所有的科学运算可视化任务'''
, win='visdom', opts={'title': u'visdom简介'} )

你可能感兴趣的:(深度学习)