官方文档
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未写造成的问题。推荐使用此方式。
使用
tensorboard --logdir runs
当SummaryWriter(log_dir='scalar')
的log_dir的参数值 存在时,将tensorboard --logdir runs 改为 tensorboard --logdir 参数值。https://localhost:6006
远程访问tensorboard,当程序在服务器上跑时,如何在本地浏览器打开tensorboard
ssh -L 16006:127.0.0.1:6006 [email protected]
tensorboard --logdir runs
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)
来将维度进行转换。
参考链接
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
参考链接
ssh -L 18097:127.0.0.1:8097 username@remote_server_ip
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作为一个客户端对象,可以使用常见的画图函数,包括:
plot
操作,用于记录某些标量的变化,如损失、准确率等Visdom中有两个重要概念:
Visdom同时支持PyTorch的tensor和Numpy的ndarray两种数据结构,但不支持Python的int、float等类型,因此每次传入时都需先将数据转成ndarray或tensor。
title
、xlabel
、ylabel
、width
等,主要用于设置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简介'}
)