visdom介绍
visdom是Facebook专门为Pytorch开发的一款可视化工具,开源于2017年3月,项目地址为visdom,其十分轻量级,但功能丰富,提供了大多数的科学运算可视化API,基本可视化界面如下图所示:
visdom支持多种数据格式的可视化,包括数值、图像、文本以及视频等,支持Pytorch、Torch和Numpy。用户可以通过编程的方式组织可视化空间或者通过用户接口为数据打造仪表板,检查实验结果和调试代码。
visdom核心概念
- env:环境
可以使用envs对可视化空间进行分区。默认地,每个用户都会有一个叫做main的envs。可以通过编程或UI创建新的envs。envs的状态是长期保存的。不同环境的可视化结果相互隔离,互不影响。在使用时如果不指定env,默认使用main。不同用户、不同程序,最好使用不同的env,避免相互影响。
- pane:窗格
窗格用于可视化图像、数值或文本等,它可以自由拖动、缩放、保存和关闭。类似于一个一个的小的窗口。一个程序可以使用同一个env中的不同pane,每个pane可视化记录某一信息。
visdom安装与使用
visdom安装十分简单,可以直接pip进行安装
pip install visdom
安装好以后,需要启动visdom服务
python -m visdom.server
或者(后台运行)
nohup python -m visdom.server &
visdom服务是一个Web Server服务,默认绑定8097端口。
基本使用,编程代码如下:
import visdom
import torch
# 新建一个连接客户端
# 指定env = 'test1'
vis = visdom.Visdom(env='test1')
x = torch.arange(1, 100, 0.01)
y = torch.sin(x)
vis.line(X=x,Y=y, win='sinx',opts={'title':'y=sin(x)'})
打开浏览器,输入localhost:8097,如下图所示:

选择我们新建的env环境:

可以看到我们绘制的图像:

对于每一个图像,其占用一个panel,都可以自由移动、缩放等
注意:
这些不会自动保存,需要手动保存save,不然会清空
常用API
Visdom支持下列API。由Plotly提供可视化支持。
vis.scatter: 2D 或 3D 散点图vis.line: 线图vis.stem: 茎叶图vis.heatmap: 热力图vis.bar: 条形图vis.histogram: 直方图vis.boxplot: 箱型图vis.surf: 表面图vis.contour: 轮廓图vis.quiver: 绘出二维矢量场vis.image: 图片vis.text: 文本vis.mesh: 网格图vis.save: 序列化状态
plot.scatter
这个函数是用来画2D或3D数据的散点图。它需要输入 N*2或N*3的 tensor X来指定N个点的位置。一个可供选择的长度为N的vector用来保存X中的点对应的标签(1 到 K)。 – 标签可以通过点的颜色反应出来。
scatter()支持下列的选项:
options.colormap: 色图(控制图的颜色) (string; default ='Viridis')options.markersymbol: 标记符号 (string; default ='dot')options.markersize: 标记大小(number; default ='10')options.markercolor: 每个标记的颜色. (torch.*Tensor; default =nil)options.legend: 包含图例名字的table
options.markercolor 是一个包含整数值的Tensor。Tensor的形状可以是 N 或 N x 3 或 K 或 K x 3.
- Tensor of size
N: 表示每个点的单通道颜色强度。 0 = black, 255 = red - Tensor of size
N x 3: 用三通道表示每个点的颜色。 0,0,0 = black, 255,255,255 = white - Tensor of size
KandK x 3: 为每个类别指定颜色,不是为每个点指定颜色。
plot.line
这个函数用来画 线图。它需要一个形状为N或者N×M的tensor Y,用来指定 M条线的值(每条线上有N个点)。和一个可供选择的tensor X 用来指定对应的 x轴的值; X可以是一个长度为N的tensor(这种情况下,M条线共享同一个x轴),也可以是形状和Y一样的tensor。
The following options are supported:
options.fillarea: 填充线下面的区域 (boolean)options.colormap: 色图 (string; default ='Viridis')options.markers: 显示点标记 (boolean; default =false)options.markersymbol: 标记的形状 (string; default ='dot')options.markersize: 标记的大小 (number; default ='10')options.legend: 保存图例名字的table
plot.stem
这个函数用来画茎叶图。它需要一个 形状为N或者N*M的 tensor X 来指定M时间序列中N个点的值。一个可选择的Y,形状为N或者N×M,用Y来指定时间戳,如果Y的形状是N,那么默认M时间序列共享同一个时间戳。
支持以下特定选项:
options.colormap: colormap (string; default ='Viridis')options.legend:tablecontaining legend names
plot.heatmap
这个函数用来画热力图。它输入一个 形状为N×M的 tensor X。X指定了热力图中位置的值。
支持下列特定选项:
options.colormap: 色图 (string; default ='Viridis')options.xmin: 小于这个值的会被剪切成这个值(number; default =X:min())options.xmax: 大于这个值的会被剪切成这个值 (number; default =X:max())options.columnnames: 包含x轴标签的tableoptions.rownames: 包含y轴标签的table
plot.bar
这个函数可以画 正常的,堆起来的,或分组的的条形图。
输入参数:
- X(tensor):形状
N或N×M,指定每个条的高度。如果X有M列,那么每行的值可以看作一组或者把他们值堆起来(取决与options.stacked是否为True)。 - Y(tensor, optional):形状
N,指定对应的x轴的值。
支持以下特定选项:
options.columnnames:tablecontaining x-axis labelsoptions.stacked: stack multiple columns inXoptions.legend:tablecontaining legend labels
plot.histogram
这个函数用来画指定数据的直方图。他需要输入长度为 N 的 tensor X。X保存了构建直方图的值。
支持下面特定选项:
options.numbins:bins的个数 (number; default = 30)
plot.boxplot
这个函数用来画箱型图:
输入:
- X(tensor): 形状
N或N×M,指定做第m个箱型图的N个值。
支持以下特定选项:
options.legend: labels for each of the columns inX
plot.surf
这个函数用来画表面图:
输入:
- X(tensor):形状
N×M,指定表面图上位置的值.
支持以下特定选项:
options.colormap: colormap (string; default ='Viridis')options.xmin: clip minimum value (number; default =X:min())options.xmax: clip maximum value (number; default =X:max())
plot.contour
这个函数用来画轮廓图。
输入:
- X(tensor):形状
N×M,指定了轮廓图中的值
支持以下特定选项:
options.colormap: colormap (string; default ='Viridis')options.xmin: clip minimum value (number; default =X:min())options.xmax: clip maximum value (number; default =X:max())
plot.quiver
这个函数用来画二维矢量场图。
输入:
- X(tensor): 形状
N*M - Y(tensor):形状
N*M - gridX(tensor, optional):形状
N*M - gradY(tensor, optional): 形状
N*MX与Y决定了 箭头的长度和方向。可选的gridX和gridY指定了偏移。
支持下列特定选项:
options.normalize: 最长肩头的长度 (number)options.arrowheads: 是否现实箭头 (boolean; default =true)
plot.image
这个函数用来画 图片。
输入:
- img(tensor): shape(
C*H*W)。
支持下面特定选项:
options.jpgquality: JPG quality (number0-100; default = 100)
plot.video
这个函数 播放一个 video。
输入: video 的文件名,或者是一个 shape 为L*H*W*C 的 tensor。这个函数不支持其它特定的功能选项。
注意:使用tensor作为输入的时候,需要安装ffmpeg。
能不能播放video取决你使用的浏览器:浏览器必须要支持Theano codec in an OGG container。(chrome可以用)。
plot.svg
此函数绘制一个SVG对象。输入是一个SVG字符串或 一个SVG文件的名称。该功能不支持任何特定的功能options。
plot.text
此函数可在文本框中打印文本。输入输入一个text字符串。目前不支持特定的options
plot.mesh
此函数画出一个网格图。
输入:
- X(tensor): shape(
N*2或N*3) 定义N个顶点 - Y(tensor, optional):shape(
M*2或M×3) 定义多边形
支持下列特定选项:
options.color: color (string)options.opacity: 多边形的不透明性 (numberbetween 0 and 1)
Customizing plots
绘图函数使用可选的options表作为输入。用它来修改默认的绘图属性。所有输入参数在单个表中指定;输入参数是基于输入表中键的匹配。
下列的选项除了对于plot.img和plot.txt不可用以外,其他的绘图函数都适用。我们称他为 通用选项。
options.title: figure titleoptions.width: figure widthoptions.height: figure heightoptions.showlegend: show legend (trueorfalse)options.xtype: type of x-axis ('linear'or'log')options.xlabel: label of x-axisoptions.xtick: show ticks on x-axis (boolean)options.xtickmin: first tick on x-axis (number)options.xtickmax: last tick on x-axis (number)options.xtickstep: distances between ticks on x-axis (number)options.ytype: type of y-axis ('linear'or'log')options.ylabel: label of y-axisoptions.ytick: show ticks on y-axis (boolean)options.ytickmin: first tick on y-axis (number)options.ytickmax: last tick on y-axis (number)options.ytickstep: distances between ticks on y-axis (number)options.marginleft: left margin (in pixels)options.marginright: right margin (in pixels)options.margintop: top margin (in pixels)options.marginbottom: bottom margin (in pixels)
注意:
如果想在同一个图中画多个曲线,原来的API updateTrace已经废弃了,可以直接在line等API加上update=”append”即可
visdom底层
visdom服务是一个Web Server服务,客户端与服务器端通过tornado进行非阻塞交互,可视化操作不会阻塞当前程序,网络异常也不会导致程序退出
参考
[1] 深度学习框架Pytorch:入门与实践(陈云著)
[2] 官方介绍:https://github.com/facebookresearch/visdom
[3] 博客:pytorch学习笔记(八):PytTorch可视化工具visdom