Visdom 是一个专门用于 PyTorch 的交互式可视化工具,可以对实时数据进行丰富的可视化,帮助我们实时监控在远程服务器上进行的科学实验。
Visdom 的可视化可以在浏览器中查看,并且很容易地与其他人进行共享可视化结果。Visdom 的可视化类型种类非常多,大家可以参考下图:
安装并启动 visdom
安装:pip install visdom
开启 visdom 服务:python -m visdom.server
会出现如下信息:
Checking for scripts.
It's Alive!
INFO:root:Application Started
You can navigate to http://localhost:8097
如果是在本机开启的服务,则在浏览器中输入http://localhost:8097
,如果是在服务器开启的服务,则在本机浏览器中输入http://[server_ip]:8097
。
此时就会启动 visdom,默认是在 main 环境下:
如果要同时或者先后训练不同的网络模型,我们可以为每个模型创建一个环境,分别显示它们的可视化结果。
绘制折线图
因为我们在训练网络的时候,想记录训练过程中的损失和准确率的变化,所以主要用到绘制折线图的函数 line()
。
首先创建包含10个随机数的数组 arr
,我对 Python List、Numpy Array 和 PyTorch Tensor 三种类型的数据都绘制折线图。
import torch
from visdom import Visdom
import numpy as np
# 新建名为'demo'的环境
viz = Visdom(env='demo')
arr = np.random.rand(10)
# Numpy Array
viz.line(Y=arr)
# Python List
viz.line(Y=list(arr))
# PyTorch tensor
viz.line(Y=torch.Tensor(arr))
上面的 Y 表示纵坐标,这里没有指定横坐标,则默认横坐标范围为(0,1)。结果如下图所示,可以看到三者的折线图完全相同。
有时候我们想在一个图中同时显示多条曲线,那么在指定横纵坐标时需要指定多个值。
N = np.linspace(-5, 5, 100) # 从范围[-5,5]中均匀取100个数
viz.line(
X=np.column_stack((N, N)),
Y=np.column_stack((N*N, np.sqrt(N+5))),
opts=dict(legend=["curv1", "curv2"],
showlegend=True,
markers=False,
title='line demo',
xlabel='Time',
ylabel='Volume',
fillarea=False),
)
可以看到两个曲线的横坐标都为N,纵坐标一个为N*N,另一个为np.sqrt(N+5)。
这个例子出现了参数 opts
,它表示对曲线的一系列操作,先介绍几个常用的,
legend
:给每条曲线指定名字;showlegend
:显示曲线的图例(默认用 1,2,3... 表示);markers
:表示是否将每个点用实心圆表示;title
:指定该图的标题;fillarea
:指定是否对曲线下方进行填充;xlabel
和ylabel
:指定横纵坐标名字。
在训练模型时,我们并不是直接对一整个列表的值进行可视化,而是想在训练的过程中,实时绘制随程序运行输出的值(比如损失值和准确率),那么可以用到 update
参数。
指定参数 update
的值为 'append',表示在曲线后面追加,也就能实现实时更新训练曲线。还必须指定参数 win
作为窗口的名字,表示每次追加内容都是在同一个窗口下。
viz = Visdom(env='demo')
x, y = 0, 0
for i in range(50):
x = i
y = i*i
viz.line(
X = np.array([x]),
Y = np.array([y]),
win = 'window',
update = 'append')
如果将参数 update
的值指定为 'insert',则表示在该窗口下新添加一条曲线。
如文章最前面的图所示,Visdom 可以显示的图不只是折线图,但是我平时只用到折线图,所以就只介绍这个,想知道其他图用法的话,可以查看官方 Visdom Demo。
如果觉得有用,就点个赞吧(ง •̀_•́)ง。