可视化工具:Visdom

  使用pytorch进行模型训练时,仅仅通过观察print的输出是不够的,有时候需要通过一些专业的工具来将损失值,训练过程中产生的图像等数据展示出来,这个时候就可以借助Visdom来实现数据的可视化。

   

参考链接:

官方教程

示例代码

   

安装

pip install visdom

启动服务

python -m visdom.server

如果运行完出现

Downloading scripts, this may take a little while

等很久都没有反应的话可以参考这里,或者直接FQ。

通过浏览器查看可视化数据:http://localhost:8097/

   

   

静态展示数据(入门)

通过如下代码可以画一条曲线和一张图片

from visdom import Visdom
import torch

vis = Visdom(env='main')
x = torch.linspace(0, 10, 1000)
y = x + 5
vis.line(X=x, Y=y)
vis.image(torch.ones((3, 100, 100)) * 127)

效果图

动态展示数据

损失值等数据肯定是动态展示的,所以需要在每次出新的损失值时,动态的添加到指定窗口中去

from visdom import Visdom
import torch

class Logger():
    def __init__(self):
        self.vis = Visdom()
        self.cur_iter = 0

    def log(self, loss):
        self.vis.line(X=[self.cur_iter], Y=[loss], win='loss', update='append')
        self.cur_iter += 1

logger = Logger()
for i in range(50000):
    loss = torch.rand([1])
    logger.log(loss)

效果图

封装后直接拿来用的代码

代码

from visdom import Visdom
import torch
import sys


class Logger():
    def __init__(self):
        self.vis = Visdom()
        self.cur_iter = 0
        self.losses = {}
        self.images = {}

    def log_loss(self, losses=None):
        for loss_name in losses.keys():
            if loss_name not in self.losses:
                self.losses[loss_name] = losses[loss_name]
            else:
                self.losses[loss_name] += losses[loss_name]
            self.vis.line(X=[self.cur_iter], Y=[losses[loss_name]], win=loss_name, update='append')
            sys.stdout.write('%s: %.4f -- ' % (loss_name, self.losses[loss_name]))
        print(self.cur_iter)
        self.cur_iter += 1

    def log_image(self, images=None):
        for image_name, tensor in images.items():
            self.vis.image(tensor, win=image_name, opts={'title': image_name})


logger = Logger()
for i in range(5000):
    logger.log_loss({
        'loss1': torch.rand([1]),
        'loss2': torch.rand([1]),
        'loss3': torch.rand([1]),
    })
    logger.log_image({
        'image1': torch.rand([3, 128, 128]),
        'image2': torch.rand([3, 128, 128]),
        'image3': torch.rand([3, 128, 128]),
    })

效果图

   

进阶

如果后续还需要定制自己用来展示数据的方式,可以参考官方教程,在原来的基础上,添加新的代码。

posted @ 2020-07-31 20:53  OnceMonkey  阅读(416)  评论(0)    收藏  举报