1,基本介绍
类似于TensorBoard, facebook开源的visdom,非常优雅,支持numpy和torch,是一款很好用的训练可视化工具,可以用来追踪训练过程中的损失值、验证精度等等指标。自然地,该工具还可以做图片的可视化显示。
Visdom采用CS架构,本身作为一个服务端(默认端口为8097,可以根据需要加上-p选项修改端口),在使用时,用户程序向服务端提供数据,在web端访问该服务,数据在web端被可视化展示(通过web-socket于前端通信)。
2,安装方法
python环境下就是这么简洁。
pip install visdom
如果是anaconda,使用:
conda install visdom
3,启动服务
默认端口为8097,可以根据需要加上-p选项修改端口。
$ python -m visdom.server # 或者直接visdom命令也可以
有以下输出代表启动成功
Downloading scripts. It might take a while.
It's Alive!
INFO:root:Application Started
You can navigate to http://localhost:8097
有的同学可能会遇到卡死的问题,原因是下载一些js、css资源文件比较慢或者根本没法访问,解决方案是手动下载即可
执行的代码在"$YOUR_PREFIX/lib/python3.6/site-packages/visdom/server.py"
# 这里需要根据自己的环境修改$YOUR_PREFIX
实际执行的部分:
def download_scripts_and_run():
download_scripts()
main()
if __name__ == "__main__":
download_scripts_and_run()
只要观察download_scripts函数,手动下载资源文件即可
4,使用方法
在python程序运行之前,请确保先启动了visdom服务(python -m visdom.server)。
# 引入可视化工具包
from visdom import Visdom
# 可视化工具对象
viz = Visdom()
# 纵轴y:[loss, acc], 横轴x:[epoch]
# [0.0, 0.0]为初始的两个Y坐标,一个为loss一个为acc
# [0.0]为初始的X坐标,一个X对应两个Y,也就是画出的图中有两条线
viz.line([[0.0, 0.0]], [0.0],win='test',opts=dict(title='loss&acc',legend=['loss','acc']))
## 中间省略很多代码
## 在训练时,每个epoch添加一下当时的loss、acc作为两个Y坐标。epoch作为X坐标
for epoch in range(start_epoch + 1, epochs):
train_loss = train(model, train_load, epoch)
accuracy, _ = test(model, test_load)
viz.line([[train_loss,accuracy]],[epoch],win='test', update='append')
print('epoch: {} , valid set accuracy: {:.4f}'.format(epoch, accuracy))
if (accuracy > best_accuracy):
best_accuracy = accuracy
# 保存模型
state = {'model': model.state_dict(), 'optimizer': optimizer.state_dict(), 'epoch': epoch,'accuracy': accuracy}
torch.save(state, log_dir)
print('epoch: {} , valid set accuracy: {:.4f}, save as:{}'.format(epoch, accuracy, log_dir))
在浏览器中访问http://localhost:8097
可以看到以下动态更新的图片:
5,官方资料
以下是其他博客的示例代码:
# coding=utf-8
import time
from visdom import Visdom
import requests
import os
import numpy as np
viz = Visdom(server='http://127.0.0.1', port=8097)
assert viz.check_connection()
# 视频下载可能比较慢,耐心等几分中
video_file = "demo.ogv"
if not os.path.exists(video_file):
video_url = 'http://media.w3.org/2010/05/sintel/trailer.ogv'
res = requests.get(video_url)
with open(video_file, "wb") as f:
f.write(res.content)
viz.video(videofile=video_file)
# 图片
# 单张图片
viz.image(
np.random.rand(3, 512, 256),
opts={
'title': 'Random',
'showlegend': True
}
)
# 多张图片
viz.images(
np.random.rand(20, 3, 64, 64),
opts={
'title': 'multi-images',
}
)
运行完上面的客户端代码后,就可以通过浏览器访问了127.0.0.1:8097