Pytorch:visdom介绍

一、介绍

在深度学习领域,模型训练是一个必须的过程,因此常常需要实时监听并可视化一些数据,如损失值loss,正确率acc等。在Tensorflow中,最常使用的工具非Tensorboard莫属;在Pytorch中,也有类似的TensorboardX,但据说其在张量数据加载的效率方面不如visdom。visdom是FaceBook开发的一款可视化工具,其实质是一款在网页端的web服务器,对Pytorch的支持较好。

Visdom中有两个重要概念:

  • env:环境。不同环境的可视化结果相互隔离,互不影响,在使用时如果不指定env,默认使用main。不同用户、不同程序一般使用不同的env。
  • pane:窗格。窗格可用于可视化图像、数值或打印文本等,其可以拖动、缩放、保存和关闭。一个程序中可使用同一个env中的不同pane,每个pane可视化或记录某一信息。

二、如何安装及启动

2.1 安装

安装命令:

pip install visdom

安装成功的界面如下图所示

 安装成功后,我们需要将visdom启动。

2.2 启动

类似于TensorFlow的TensorBoard,要使用Visdom,就要先在终端开启监听命令。

vidsom启动命令:

python -m visdom.server

或者通过如下命令

nohup python -m visdom.server &

将服务放至后台运行。

visdom成功启动后,会返回一个网址(如下图)。根据显示的网址然后在浏览器里输入:http://localhost:8097 进行登录。

Pytorch:visdom介绍_第1张图片

 进入网址后,浏览器会显示visdom的主界面。

Pytorch:visdom介绍_第2张图片

  python终端会实时显示数据交互过程:

Pytorch:visdom介绍_第3张图片

 三、Visdom可视化神经网络训练过程


首先,我们需要导入Visdom及所需的其它库

from visdom import Visdom
import numpy as np
import time

Visdom可视化神经网络的训练过程大致分为3步:

  1. 实例化一个窗口
  2. 初始化窗口的信息
  3. 更新监听的信息

3.1 监听单一数据

示例:监听train_loss的变化

# 实例化一个窗口
wind = Visdom()
# 初始化窗口信息
wind.line([0.],  # Y的第一个点的坐标
          [0.],  # X的第一个点的坐标
          win='train_loss',  # 窗口的名称
          opts=dict(title='train_loss')  # 图像的标例
          )
# 更新数据
for step in range(10):
    # 随机获取loss,这里只是模拟实现
    loss = np.random.randn() * 0.5 + 2
    wind.line([loss], [step], win='train_loss', update='append')
    time.sleep(0.5)

运行结果:此时打开visdom的主界面,会发现窗口train_loss已经显示出来了

Pytorch:visdom介绍_第4张图片

3.2 监听多条数据

示例:监听train_loss和acc
# 实例化窗口

from visdom import Visdom
import numpy as np
import time

# 实例化窗口
wind = Visdom()
# 初始化窗口参数
wind.line([[0., 0.]], [0.], win='train', opts=dict(title='loss&acc', legend=['loss', 'acc']))
# 更新窗口数据
for step in range(10):
    loss = 0.2 * np.random.randn() + 1
    acc = 0.1 * np.random.randn() + 0.5
    wind.line([[loss, acc]], [step], win='train', update='append')
    time.sleep(0.5)

运行结果

Pytorch:visdom介绍_第5张图片

 

 

书籍例子:

import torch as t
import visdom

# 新建一个连接客户端
# 指定env = u'test1',默认端口为8097,host是‘localhost'
vis = visdom.Visdom(env=u'test1',use_incoming_socket=False)

x = t.arange(1, 30, 0.01)
y = t.sin(x)
vis.line(X=x, Y=y, win='sinx', opts={'title': 'y=sin(x)'})

结果输出:

Pytorch:visdom介绍_第6张图片 

 3.3 可以通过update参数(append/new)控制数据更新

代码:

import time
import cv2
import visdom
import numpy as np
import torch as t

vis = visdom.Visdom(env="image test")

# append 追加数据
for ii in range(0, 10):
    # y = x
    x = t.Tensor([ii])
    y = x
    vis.line(X=x, Y=y, win='polynomial', update='append' if ii > 0 else None)

# updateTrace 新增一条线
x = t.arange(0, 9, 0.1)
y = (x ** 2) / 9
vis.line(X=x, Y=y, win='polynomial', name='this is a new Trace', update='new')

结果:

Pytorch:visdom介绍_第7张图片

 

下面逐一分析这几行代码:

  • vis = visdom.Visdom(env=u'test1'),用于构建一个客户端,客户端除指定env之外,还可以指定host、port等参数。
  • vis作为一个客户端对象,可以使用常见的画图函数,包括:

    • line:类似Matlab中的plot操作,用于记录某些标量的变化,如损失、准确率等
    • image:可视化图片,可以是输入的图片,也可以是GAN生成的图片,还可以是卷积核的信息
    • text:用于记录日志等文字信息,支持html格式
    • histgram:可视化分布,主要是查看数据、参数的分布
    • scatter:绘制散点图
    • bar:绘制柱状图
    • pie:绘制饼状图
    • 更多操作可参考visdom的github主页

这里主要介绍深度学习中常见的line、image和text操作。

Visdom同时支持PyTorch的tensor和Numpy的ndarray两种数据结构,但不支持Python的int、float等类型,因此每次传入时都需先将数据转成ndarray或tensor。上述操作的参数一般不同,但有两个参数是绝大多数操作都具备的:

  • win:用于指定pane的名字,如果不指定,visdom将自动分配一个新的pane。如果两次操作指定的win名字一样,新的操作将覆盖当前pane的内容,因此建议每次操作都重新指定win。
  • opts:选项,接收一个字典,常见的option包括titlexlabelylabelwidth等,主要用于设置pane的显示格式。

四、Visdom可视化图像

1、案例:在处理图像数据时,可以使用visdom对图像进行可视化。

from visdom import Visdom
import cv2
import numpy as np
import torch
import os
# 新建一个连接客户端
# 指定env = u'test1',默认端口为8097,host是‘localhost'
vis = Visdom(env=u'test1',use_incoming_socket=False)

# 读入图像
path1 = os.getcwd()

print("Current Path: {0}".format(path1))
image = cv2.imread('gudongche-01.jpg')
# # openCV按照BGR读取,而visdom 默认按照RGB显示,因此要进行通道转换
img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# visdom类似于pytorch中的卷积模型,接收的数据都要求通道数在前
img = np.transpose(img, (2, 0, 1))
# 将numpy类型转换为torch类型
img = torch.from_numpy(img)
# 可视化图像
vis.image(img, win='pkq')

运行结果:

Pytorch:visdom介绍_第8张图片

 2、其他举例

1)显示图像 (加了可视化配置参数opts)

图像显示底层调用的PIL库。但平时更喜欢用opencv,此处使用cv2,PIL使用更方便不用转换。

import time
import cv2
import visdom
import numpy as np

viz = visdom.Visdom(env="image test")


img = cv2.imread("gudongche-01.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = np.transpose(img, (2, 0, 1))
# img = img.astype(np.float32) / 255
print(img.shape, img.dtype)
# image demo
viz.image(
    img,
    opts={'title': 'Random!', 'caption': 'Click me!'},
)

2)image图像显示与更新窗口显示:(在一个image窗口中不断更新显示图像)

代码:

import time
import cv2
import visdom
import numpy as np

viz = visdom.Visdom(env="image test")


img = cv2.imread("gudongche-01.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = np.transpose(img, (2, 0, 1))
# img = img.astype(np.float32) / 255
print(img.shape, img.dtype)
# image demo
image = viz.image(np.random.rand(3, 256, 256), opts={'title': 'image1', 'caption': 'How random.'})
for i in range(100):
    viz.image(np.random.randn(3, 256, 256), win=image)
    time.sleep(0.5)

结果:

Pytorch:visdom介绍_第9张图片

 3)images多个图像显示与更新:(窗口显示生成20个大小为64*64的三通道图)

代码:

import time
import cv2
import visdom
import numpy as np

viz = visdom.Visdom(env="image test")


img = cv2.imread("gudongche-01.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = np.transpose(img, (2, 0, 1))
# img = img.astype(np.float32) / 255
print(img.shape, img.dtype)
# image demo
images = viz.images(
    np.random.randn(20, 3, 64, 64),
    opts=dict(title='Random images', caption='How random.', nrow=5)
)
for i in range(100):
    # 可视化20张随机的彩色图片,每一行5张
    viz.images(np.random.randn(20, 3, 64, 64), win=images, nrow=5)
    time.sleep(0.5)

依赖数据大小控制张数:images接收一个四维向量N×C×H×W,N是张数,C可以是1或3,分别代表黑白和彩色图像。

结果:

Pytorch:visdom介绍_第10张图片 

 参考:

1、visdom image显示图像(四)_alex1801的博客-CSDN博客_visdom展示图片

2、Visdom可视化学习笔记(一):通过visdom画曲线和显示图片总结_ZZY_dl的博客-CSDN博客_visdom显示图片

你可能感兴趣的:(Pytorch,visdom,pytorch)