在PyTorch中使用Visdom可视化工具_可视化

一、Visdom

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

二、概述

​Visdom​​旨在促进(远程)数据的可视化,重点是支持科学实验。 

 为您自己和您的合作者广播情节,图像和文字的可视化。

以编程方式或通过​​UI​​​组织可视化空间,为实时数据创建仪表板,检查实验结果或调试实验代码。 

三、概念

​Visdom​​有一套简单的功能,可以组成不同的案例。

1、窗口

用户界面以空白的形式开始 - 您可以用图表,图像和文本填充它。出现在窗口中的内容,您可以拖放,调整大小和销毁。窗口存在于​​envs​​​中并且​​envs​​​的状态通过​​sessions​​​存储。你可以下载窗口中的内容 - 包括​​SVG​​中的图。


提示:您可以使用浏览器的缩放比例来调整​​UI​​的比例。


1、回调

​python Visdom​​​支持实现窗口上的回调。​​Demo​​​以可编辑文本板的形式显示。这些回调函数允许​​Visdom​​对象接收并响应前端发生的事件。

您可以通过向事件处理程序代码添加一个函数来为事件订阅窗口,该函数用于通过调用​​viz.register_event_handler(handler, win_id)​​​处理程序和窗口标识调用要订阅的窗口标识。多个处理程序可以注册到同一个窗口。您可以使用​​viz.clear_event_handlers(win_id)​​删除窗口中的所有事件处理程序。当在窗口发生一个事件时,你的回调将在包含以下内容的字典上被调用:

  • ​event_type​​:以下事件类型之一
  • ​pane_data​​:该窗口的所有存储内容包括布局和内容。
  • ​eid​​:当前的环境ID
  • ​target​​:调用事件的窗口ID

其他参数定义如下。

现在支持两个回调事件:

  • ​Close​​ - 关闭窗口时触发。返回只有前述字段的字典。
  • ​KeyPress​​ - 按下某个键时触发。包含其他参数:
  • ​key​​​ - 按下的键的字符串表示形式(应用​​SHIFT​​等状态修饰符)
  • ​key_code​​​ - 按下键的​​javascript​​事件键码(无修饰符)

四、环境

您可以使用​​envs​​​划分您的可视化空间。默认情况下,每个用户将有一个​​env​​​调用​​main​​​。新的​​envs​​​可以在用户界面或以编程方式创建。​​envs​​的状态是长期保存的。

您可以通过​​URL​​​访问特定的​​ENV​​​: ​​http://localhost.com:8097/env/main。如果您的服务器托管在网上,直接分享你的网址那样其他人也可以看到您的可视化​​。


管理 Envs :您的envs在服务器初始化时加载,默认情况下从$HOME/.visdom/。自定义路径可以作为cmd行参数传递。通过.json从环境中删除相应的文件来删除Envs 。


1、选择环境

在PyTorch中使用Visdom可视化工具_可视化_02 从主页面可以使用环境选择器在不同的环境之间切换。选择新环境将向服务器查询该环境中存在的图。

2、清除环境

您可以使用橡皮擦按钮来删除环境中当前的所有内容。这将关闭该环境的情节窗口,并且保留空白的新窗口。

3、管理环境

在PyTorch中使用Visdom可视化工具_深度学习_03 按下文件夹图标将打开一个对话框,允许您复制或强制保存当前环境,或删除当前环境的所有内容。该功能的使用在​​​State​​一节中有充分的描述。


​Env​​​文件: 您的​​envs​​​在服务器初始化时加载,默认情况下为​​$HOME/.visdom/​​​。自定义路径可以作为​​cmd​​​行参数传递。通过使用删除按钮或从环境中删除相应的​​.json​​​文件来删除​​Envs​​。


五、状态

当你创建了几个可视化后,状态保持不变。服务器自动缓存您的可视化 —— 如果你重新加载页面,可视化就会再现。

  • ​save​​​:您可以使用​​save​​​按钮手动执保存。这将序列化​​env​​​的状态(以​​JSON​​​形式到磁盘),包括窗口位置。您可以以​​env​​编程方式保存。 这有助于更为复杂的配置有意义的可视化,例如数据丰富的演示、模型训练仪表板或系统实验。这也使得它们易于共享和重用。
  • ​Fork​​​:如果你输入一个新的​​env​​​名字,保存将会创建一个新的​​env​​​ - 有效地分割以前的​​env​​。

六、过滤

您可以使用​​filter​​​动态筛选​​env​​​中的窗口 - 只要提供一个正则表达式来匹配您要显示的窗口的标题。这可以有助于涉及​​env​​与许多窗口的使用情况,例如系统地检查实验结果。


注意:如果您保存了当前视图,则清除过滤器后视图将被恢复。 


在PyTorch中使用Visdom可视化工具_pytorch_04

七、安装

需要​​Python 2.7/3​​​(和可选的​​Torch7​​)

# 安装visdom
pip install visdom

# 安装Torch客户端
luarocks install visdom

# 从源代码安装
pip install -e .
# 如果上述问题出现,您可以尝试下面的
easy_install .

# 从源代码安装Torch客户端(从目录中)
luarocks make

八、用法

启动服务器(可能是在​​screen​​​或​​tmux​​中):

python -m visdom.server

现在可以通过访问​​http://localhost:8097​​​或者​​127.0.0.1:8097​​​浏览器访问​​Visdom​​ ,或者指定您自己的主机地址。


如果上述操作不起作用,请将以下行添加到本地 ​​~/.ssh/config:LocalForward 127.0.0.1:8097 127.0.0.1:8097​​。


1、命令行选项

以下选项可以提供给服务器:

  • ​-port​​:运行服务器的端口。
  • ​-env_path​​:重新加载序列化会话的路径。
  • ​-logging_level​​​:记录级别(默认=​​INFO​​)。接受标准文本和数字记录值。

2、Python中的使用示例

import visdom
import numpy as np
vis = visdom.Visdom()
vis.text('Hello, world!')
vis.image(np.ones((3, 10, 10)))

3、Torch中的使用例子

require 'image'
vis = require 'visdom'()
vis:text{text = 'Hello, world!'}
vis:image{img = image.fabio()}

有些用户在将​​Lua​​​客户端连接到​​Visdom​​​服务器时报告了问题。可能是因为你关闭了​​IPv6​​:

vis = require 'visdom'()
vis.ipv6 = false -- switches off IPv6
vis:text{text = 'Hello, world!'}

Demos:

python example/demo.py
th example/demo1.lua
th example/demo2.lua

九、API

有关快速入门的功能​​visdom​​​,请查看​​example​​目录,或阅读下面的详细信息。

1、基础

​Visdom​​提供以下基本的可视化功能:

  • vis.image:图片
  • vis.images:图像列表
  • vis.text:任意的HTML
  • vis.video:视频
  • vis.svg:SVG对象
  • vis.save:序列化状态服务器端

2、绘制

我们已经封装了几种常见的绘图类型,以便轻松创建基本可视化。这些可视化由Plotly​提供支持。

目前支持以下​​API​​:

  • vis.scatter:2D或3D散点图
  • vis.line:线图
  • vis.updateTrace:更新现有的线/散点图
  • vis.stem:干地块
  • vis.heatmap:热图地块
  • vis.bar:条形图
  • vis.histogram:直方图
  • vis.boxplot:盒子
  • vis.surf:表面重复
  • vis.contour:等高线图
  • vis.quiver:颤抖的情节
  • vis.mesh:网格图

3、通用情节

请注意,服务器​​API​​​遵守​​Plotly​​​约定​​data​​​和​​layout​​​对象,以便您可以生成自己的任意​​Plotly​​可视化对象:

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'})

4、其他

  • vis.close :通过ID关闭一个窗口
  • vis.win_exists :通过id检查一个窗口是否已经存在
  • vis.check_connection:检查服务器是否连接

十、细节

1、基本

vis.image

这个函数绘制一个​​img​​​。它将 包含图像的​​CxHxW​​​张量作为输入​​img​​。

以下​​opts​​是支持的:

  • ​opts.jpgquality​​​:​​JPG​​​质量(​​number0-100​​​;默认=​​100​​)
  • ​opts.caption​​:图像的标题

vis.images

这个函数绘制一个列表​​images​​​。它需要一个输入​​B x C x H x W​​​张量或​​list of images​​​全部相同的大小。它使大小的图像(​​B / Nrow,Nrow​​)的网格。

以下参数和​​opts​​支持:

  • ​nrow​​:连续的图像数量
  • ​padding​​:在图像周围填充,四边均匀填充
  • ​opts.jpgquality​​​:​​JPG​​​质量(​​number0-100;​​​默认=​​100​​)
  • ​opts.caption​​:图像的标题

vis.text

这个功能在一个盒子里打印文本。你可以使用它来嵌入任意的​​HTML​​​。它需要输入一个​​text​​​字符串。​​opts​​目前没有具体的支持。

vis.video

此功能播放视频。它输入视频的文件名​​videofile​​​或一个​​LxCxHxW​​​尺度的​​tensor​​​(在​​Lua​​​)或或​​LxHxWxC​​​尺度的​​tensor​​​包含视频作为输入的所有帧(在​​Python​​​)。该功能不支持任何情节特定​​opts​​。

以下​​opts​​是支持的:

  • ​opts.fps​​​:视频的​​FPS​​​(​​integer>0​​​;默认=​​25​​)

注意:使用tensor输入需要安装并运行ffmpeg。您播放视频的能力可能取决于您使用的浏览器:您的浏览器必须支持OGG容器中的Theano编解码器(Chrome支持此功能)。

vis.svg

这个函数绘制一个SVG对象。它将SVG字符串svgstr或SVG文件的名称作为输入svgfile。该功能不支持任何特定的 opts。

vis.save

这个功能保存envs在visdom服务器上的活动。它需要输入一个列表(在Python中)或表(在lua中)env id被保存。

绘制

关于包装绘图功能的更多细节在下面给出。

绘图函数的确切输入是不一样的,尽管其中大多数输入的张X量比包含数据的张量Y和包含可选数据变量(如标签或时间戳)的(可选的)张量要大。所有的绘图功能都可以作为一个可选项win,用来绘制到一个特定的窗口; 每个绘图函数也返回win它绘制的窗口。还可以指定env 可视化应该添加到的窗口。

vis.scatter

此功能绘制2D或3D散点图。它需要输入一个Nx2或 一个Nx3张量X来指定N散点图中点的位置。一个可选的N张量,Y其中包含离散的标签,范围介于1和K可以指定 - 标签将反映在标记的颜色。以下opts是支持的:

  • opts.colormap :colormap(string; default = 'Viridis')
  • opts.markersymbol:标志符号(string;默认= 'dot')
  • opts.markersize :标记大小(number;默认= '10')
  • opts.markercolor:每个标记的颜色。(torch.*Tensor; default = nil)
  • opts.legend :table包含图例名称

opts.markercolor是一个整数值的张量。张量可以是大小N或N x 3或K或K x 3。

  • 尺寸张量N:每个数据点的单一强度值。0 =黑色,255 =红色
  • 尺寸张量N x 3:每个数据点的红色,绿色和蓝色强度。0,0,0 =黑色,255,255,255 =白色
  • 尺寸K和张量K x 3:与每个数据点具有唯一的颜色不同,对于特定标签的所有点共享相同的颜色。

vis.line

这个函数绘制一个线条图。它需要输入一个N或NxM张量 Y来指定要绘制的M线(连接N点)的值。它还采用可选的X张量来指定相应的x轴值; X可以是一个N张量(在这种情况下,所有的线将共享相同的x轴值)或具有相同的大小Y。

以下opts是支持的:

  • opts.fillarea :填充行(boolean)以下的区域
  • opts.colormap :colormap(string; default = 'Viridis')
  • opts.markers :show markers(boolean; default = false)
  • opts.markersymbol:标志符号(string;默认= 'dot')
  • opts.markersize :标记大小(number;默认= '10')
  • opts.legend :table包含图例名称

vis.updateTrace

此功能允许更新现存的线或散点图的数据。

用户可以指定name一个现有的轨迹,如果他们想要添加到它的话,还可以指定一个新name的轨迹。默认情况下,如果在首次创建时没有指定图例,那么图例name中的行的索引是。

如果没有name指定,所有的痕迹应该被更新。跟踪更新数据全部NaN被忽略; 这可以用于掩蔽更新。

该append参数确定更新数据是否应附加到或替换现有数据。

没有,opts因为他们被假定为从指定的情节继承。

vis.stem

这个函数绘制一个干图。它需要输入一个N或NxM张量 X来指定时间序列中的N点的值M。包含时间戳的可选N或NxM张量Y也可以被指定; 如果Y是N张量,则M假定所有时间序列具有相同的时间戳。

以下opts是支持的:

  • opts.colormap:colormap(string; default = 'Viridis')
  • opts.legend :table包含图例名称

vis.heatmap

这个函数绘制一个热图。它需要输入NxM张量X来指定热图中每个位置的值。

以下opts是支持的:

  • opts.colormap :colormap(string; default = 'Viridis')
  • opts.xmin :剪辑最小值(number;默认= X:min())
  • opts.xmax :剪辑最大值(number;默认= X:max())
  • opts.columnnames:table包含x轴标签
  • opts.rownames :table包含y轴标签

vis.bar

这个函数绘制一个规则的,堆积的或分组的条形图。它需要输入一个N或NxM张量X来指定每个条的高度。如果X包含M列,则对应于每行的值将被堆叠或分组(取决于如何opts.stacked设置)。除此之外X,还可以指定一个(可选的)N张量Y,其中包含相应的x轴值。

opts目前支持以下特定于图表的功能:

  • opts.rownames:table包含x轴标签
  • opts.stacked :堆栈中的多个列 X
  • opts.legend :table包含图例标签

vis.histogram

该功能绘制指定数据的直方图。它需要输入一个N张量X来指定构建直方图的数据。

opts目前支持以下特定于图表的功能:

  • opts.numbins:垃圾箱数量(number;默认= 30)

vis.boxplot

此函数绘制指定数据的箱形图。它需要输入一个N或一个NxM张量X来指定N构造M箱形图的数据值。

opts目前支持以下特定于图表的功能:

  • opts.legend:中的每一列的标签 X

vis.surf

这个函数绘制一个曲面图。它需要输入NxM张量X 来指定曲面图中每个位置的值。

以下opts是支持的:

  • opts.colormap:colormap(string; default = 'Viridis')
  • opts.xmin :剪辑最小值(number;默认= X:min())
  • opts.xmax :剪辑最大值(number;默认= X:max())

vis.contour

这个函数绘制一个等高线图。它需要输入一个NxM张量X 来指定轮廓图中每个位置的值。

以下opts是支持的:

  • opts.colormap:colormap(string; default = 'Viridis')
  • opts.xmin :剪辑最小值(number;默认= X:min())
  • opts.xmax :剪辑最大值(number;默认= X:max())

vis.quiver

此函数绘制,其中的箭头的方向和长度由所确定的颤动情节NxM张量X和Y。两个可选的NxM 张量gridX,gridY可以提供指定箭头的偏移量; 默认情况下,箭头将在常规网格上完成。

以下opts是支持的:

  • opts.normalize:最长箭头的长度(number)
  • opts.arrowheads:显示箭头(boolean;默认= true)

vis.mesh

此函数从一个Nx2或一个Nx3矩阵中定义的一组顶点绘制一个网格图 X,以及在一个可选Mx2或 Mx3矩阵中定义的多边形Y。

以下opts是支持的:

  • opts.color:color(string)
  • opts.opacity:多边形不透明度(number介于0和1之间)

定制情节

绘图功能采用可选opts表格作为输入,可用于更改绘图属性(通用或特定于绘图)的属性。所有输入参数都在一个表中指定; 输入参数是基于它们在输入表中具有的键的匹配。

以下opts是通用的,它们对于所有可视化(除了plot.image和plot.text)是相同的:

  • opts.title :图标题
  • opts.width :图宽度
  • opts.height :身高
  • opts.showlegend :显示图例(true或false)
  • opts.xtype :x轴的类型('linear'或'log')
  • opts.xlabel :x轴的标签
  • opts.xtick :在x轴上显示刻度(boolean)
  • opts.xtickmin :先在x轴上打勾(number)
  • opts.xtickmax :在x轴上的最后一个勾号(number)
  • opts.xtickvals :在x轴(蜱位置table的number多个)
  • opts.xticklabels:蜱上x轴(标签table的string多个)
  • opts.xtickstep :x轴上的滴答声之间的距离(number)
  • opts.ytype :y轴的类型('linear'或'log')
  • opts.ylabel :y轴的标签
  • opts.ytick :在y轴上显示刻度(boolean)
  • opts.ytickmin :首先在y轴上打勾(number)
  • opts.ytickmax :最后在y轴上打勾(number)
  • opts.ytickvals :在y轴的刻度位置(table的number多个)
  • opts.yticklabels:蜱上y轴标签(table的string多个)
  • opts.ytickstep :Y轴上的刻度之间的距离(number)
  • opts.marginleft :左边距(以像素为单位)
  • opts.marginright :右边距(以像素为单位)
  • opts.margintop :顶部边距(以像素为单位)
  • opts.marginbottom:底部边距(以像素为单位)

其他选项是可视化特定的,并在功能的文档中进行了描述。

其他

vis.close

这个函数关闭一个特定的窗口。它需要输入窗口ID win和环境ID eid。使用win如None关闭所有窗口的环境。

vis.win_exists

这个函数返回一个布尔值,表示win服务器上是否存在一个窗口。如果出现错误,则返回无。

可选参数:

  • env:搜索窗口的环境。默认是None。

vis.check_connection

这个函数返回一个布尔值,表示服务器是否连接。