Pytorch学习系列之十:Visdom的使用方法

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,官方资料

官方demo

以下是其他博客的示例代码:

# 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

Guess you like

Origin blog.csdn.net/thequitesunshine007/article/details/121639246