本文 已参与「新人创作礼」活动,一起开启掘金创作之路。
首先简单介绍下visdom,它是一款可视化服务,就是在使用pytroch训练模型的时候,可以通过visdom来可视化中间的数据,比如loss、Accuracy和图片等数据。
当然本文不会介绍visdom的所有使用方法,但是会介绍一些常用的方法。
1、预览
通过这张图,我们可以看到visdom的主要界面长什么样子,当然,不仅仅是静态的,大部分是动态数据的展示。
2、安装
pip install visdom
visdom只支持 python 2,因此,如果没有Python3 需要更新下版本。
3、启动 visdom 的 server
python -m visdom.server
执行这个命令后就会在控制台上显示 http://localhost:8097,点击进入即可进入主页面
这些启动的端口是可以自己设置的,我这里就不做很复杂的配置了,毕竟我们只需要使用这个工具,并非需要部署到商业应用。有些默认的配置足够
4、绘制
vis.image: 图片vis.images: 图像列表vis.text: 任意 HTMLvis.properties: 属性网格vis.audio: 声音的vis.video: 视频vis.svg: SVG 对象vis.matplot: matplotlib 绘图vis.save: 序列化状态服务器端
图片绘制的类别
vis.scatter: 2D or 3D scatter plotsvis.line: line plotsvis.stem: stem plotsvis.heatmap: heatmap plotsvis.bar: bar graphsvis.histogram: histogramsvis.boxplot: boxplotsvis.surf: surface plotsvis.contour: contour plotsvis.quiver: quiver plotsvis.mesh: mesh plotsvis.dual_axis_lines: double y axis line plots
1、绘制文本
这是一个最简单的示例
import visdom
vis = visdom.Visdom()
vis.text('Hello, world!')
2、绘制执行
# 定义一个字典
# x x轴的数据
# y y轴的数据
# mode 表示是 模式这里是标签加线条的方式
# marker标记的样式 type值目前来看并没有什么具体作用
# text 表示每个点的名称,鼠标点击上去会有效果韩式
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')
# 布局的信息
# title名称
# xaxis x标签
# yaxis y标签
layout = dict(title="First Plot", xaxis={'title': 'x1'}, yaxis={'title': 'x2'})
vis._send({'data': [trace], 'layout': layout, 'win': 'mywin'})
vis.close: close a window by idvis.delete_env: delete an environment by env_idvis.win_exists: check if a window already exists by idvis.get_env_list: get a list of all of the environments on your servervis.win_hash: get md5 hash of window's contentsvis.get_window_data: get current data for a windowvis.check_connection: check if the server is connectedvis.replay_log: replay the actions from the provided log file
3、简单的直线绘制
我想,对于我们这个工具来说,最简单的使用即可,并不需要太多花里胡哨的内容,比如下面
import visdom
vis = visdom.Visdom()
vis.line(Y=[4,5,6],X=[1,2,3])
我们依然可以达到效果,这里就没有那么多的内容
4、动态更新
这个应该是一个比较炫酷的功能,在我们训练模型的时候,我们经常需要查看loss或者acc的实时动态变化,那么我们就可以使用这个功能,我们先看下效果
再看一眼代码:
import visdom
vis = visdom.Visdom()
vis.line(Y=[4,5,6],X=[1,2,3],win="mywin",update="append")
vis.line(Y=[12,15,18],X=[4,5,6],win="mywin",update="append")
这里我写两行的目的就是为了表明这个数据是可以接着前面继续往后画的,但是必须要指定win="mywin",update="append"这两个属性
5、绘制图片
import visdom
import torch
import cv2
import numpy as np
from PIL import Image
import torchvision.transforms.functional as tf
vis = visdom.Visdom(env="test")
# 从源码上看,无论绘制单张图片,还是多张图片,我们都需要将图片数据转为Tensor数据
# def image(self, img: Tensor, win: _OptStr = ..., env: _OptStr = ..., opts: _OptOps = ...) -> _SendReturn: ...
# def images(
# self,
# tensor: Tensor,
# nrow: int = ...,
# padding: int = ...,
# win: _OptStr = ...,
# env: _OptStr = ...,
# opts: _OptOps = ...,
# ) -> _SendReturn: ...
demo_pic = Image.open("./MNIST/a.jpg")
img_tensor = tf.to_tensor(demo_pic)
vis.image(img=img_tensor,win="mydemo")
当然你也可以绘制多张图片,但是我们训练过程中的数据可能不是这样的,我们就并非需要进行这样的转换
例如下面这种情况,在训练过程中我们的图片数据直接可以放进去使用
from visdom import Visdom
import numpy as np
import torch
viz = Visdom(env='test')
# 这句话就新建一个连接客户端
# 可视化一张随机的黑白图片
viz.image(torch.randn(64, 64).numpy())
# 可视化一张随机的彩色图片
viz.image(torch.randn(3, 64, 64).numpy(), win='random2')
# 可视化36张随机的彩色图片,每行6张
# viz.image(torch.randn(36,3,64,64).numpy(), nrow=6, win='random3',opts={'title':'random_imgs'})
viz.images(torch.randn(36, 3, 64, 64).numpy(), nrow=6, win='random3', opts={'title': 'random_imgs'})
6、注意事项
vis = visdom.Visdom(env="test")
如果我们设置了 env选项,我们在可视化界面的时候就需要选择我们的环境,默认情况下是Main环境,否则不会会给我造成一种假象,就是没有显示,实际上是显示了