≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 网络编程 > Python

python第三方库visdom的使用的深入分析

人气:317 时间:2021-06-02

这篇文章主要为大家详细介绍了python第三方库visdom的使用的深入分析,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随四海网的雯雯来看看吧!

概述

Visdom:一个灵活的可视化工具,可用来对于 实时,富数据的 创建,组织和共享。支持Torch和Numpy还有pytorch。

visdom
可以实现远程数据的可视化,对科学实验有很大帮助。我们可以远程的发送图片和数据,并进行在ui界面显示出来,检查实验结果,或者debug.

要用这个先要安装,对于python模块而言,安装都是蛮简单的:

代码如下:



pip install visdom

python第三方库visdom的使用入门教程

安装完每次要用直接输入代码打开:

代码如下:



python -m visdom.server

python第三方库visdom的使用入门教程

然后根据提示在浏览器中输入相应地址即可,默认地址为:http://localhost:8097/

使用示例

1. vis.text(), vis.image()

代码如下:



import visdom  # 添加visdom库
import numpy as np  # 添加numpy库
vis = visdom.Visdom(env='test')  # 设置环境窗口的名称,如果不设置名称就默认为main
vis.text('test', win='main')  # 使用文本输出
vis.image(np.ones((3, 100, 100)))  # 绘制一幅尺寸为3 * 100 * 100的图片,图片的像素值全部为1

python第三方库visdom的使用入门教程

其中:

visdom.Visdom(env=‘命名新环境')
vis.text(‘文本', win=‘环境名')
vis.image(‘图片',win=‘环境名')

2. 画直线 .line() 一条

代码如下:



import visdom
import numpy as np
vis = visdom.Visdom(env='my_windows')  # 设置环境窗口的名称,如果不设置名称就默认为main
x = list(range(10))
y = list(range(10))
# 使用line函数绘制直线 并选择显示坐标轴
vis.line(X=np.array(x), Y=np.array(y), opts=dict(showlegend=True))

python第三方库visdom的使用入门教程

vis.line([x], [y], opts=dict(showlegend=True)[展示说明])

两条

代码如下:



import visdom
import numpy as np
vis = visdom.Visdom(env='my_windows')
x = list(range(10))
y = list(range(10))
z = list(range(1,11))
vis.line(X=np.array(x), Y=np.column_stack((np.array(y), np.array(z))),  opts=dict(showlegend=True))

python第三方库visdom的使用入门教程

vis.line([x], [y=np.column_stack((np.array(y),np.array(z),np.array(还可以增加)))])
np.column_stack(a,b), 表示两个矩阵按列合并

sin(x)曲线

代码如下:



import visdom
import torch
vis = visdom.Visdom(env='sin')
x = torch.arange(0, 100, 0.1)
y = torch.sin(x)
vis.line(X=x,Y=y,win='sin(x)',opts=dict(showlegend=True))

python第三方库visdom的使用入门教程

持续更新图表

代码如下:



import visdom
import numpy as np
vis = visdom.Visdom(env='my_windows')
# 利用update更新图像
x = 0
y = 0
my_win = vis.line(X=np.array([x]), Y=np.array([y]), opts=dict(title='Update'))
for i in range(10):
    x += 1
    y += i
    vis.line(X=np.array([x]), Y=np.array([y]), win=my_win, update='append')

python第三方库visdom的使用入门教程

使用“append”追加数据,“replace”使用新数据,“remove”用于删除“name”中指定的跟踪。

vis.images()

代码如下:



import visdom
import torch
# 新建一个连接客户端
# 指定env = 'test1',默认是'main',注意在浏览器界面做环境的切换
vis = visdom.Visdom(env='test1')
# 绘制正弦函数
x = torch.arange(1, 100, 0.01)
y = torch.sin(x)
vis.line(X=x,Y=y, win='sinx',opts={'title':'y=sin(x)'})
# 绘制36张图片随机的彩色图片
vis.images(torch.randn(36,3,64,64).numpy(),nrow=6, win='imgs',opts={'title':'imgs'})

python第三方库visdom的使用入门教程

绘制loss函数的变化趋势

代码如下:



#绘制loss变化趋势,参数一为Y轴的值,参数二为X轴的值,参数三为窗体名称,参数四为表格名称,参数五为更新选项,从第二个点开始可以更新
vis.line(Y=np.array([totalloss.item()]), X=np.array([traintime]),
                win=('train_loss'),
                opts=dict(title='train_loss'),
                update=None if traintime == 0 else 'append'
                )

python第三方库visdom的使用入门教程

对于Visdom更详细的代码示例详见 链接1

更多介绍详见 链接2

实际代码

此代码出自CycleGAN的 utils.py 里一个实现

代码如下:



# 记录训练日志,显示生成图,画loss曲线 的类
class Logger():
    def __init__(self, n_epochs, batches_epoch):
        '''
        :param n_epochs:  跑多少个epochs
        :param batches_epoch:  一个epoch有几个batches
        '''
        self.viz = Visdom() # 默认env是main函数
        self.n_epochs = n_epochs
        self.batches_epoch = batches_epoch
        self.epoch = 1 # 当前epoch数
        self.batch = 1 # 当前batch数
        self.prev_time = time.time()
        self.mean_period = 0
        self.losses = {}
        self.loss_windows = {} # 保存loss图的字典集合
        self.image_windows = {} # 保存生成图的字典集合

    def log(self, losses=None, images=None):
        self.mean_period += (time.time() - self.prev_time)
        self.prev_time = time.time()

        sys.stdout.write('\rEpoch %03d/%03d [%04d/%04d] -- ' % (self.epoch, self.n_epochs, self.batch, self.batches_epoch))

        for i, loss_name in enumerate(losses.keys()):
            if loss_name not in self.losses:
                self.losses[loss_name] = losses[loss_name].data.item() #这里losses[loss_name].data是个tensor(包在值外面的数据结构),要用item方法取值
            else:
                self.losses[loss_name] = losses[loss_name].data.item()

            if (i + 1) == len(losses.keys()):
                sys.stdout.write('%s: %.4f -- ' % (loss_name, self.losses[loss_name]/self.batch))
            else:
                sys.stdout.write('%s: %.4f | ' % (loss_name, self.losses[loss_name]/self.batch))

        batches_done = self.batches_epoch * (self.epoch - 1) + self.batch
        batches_left = self.batches_epoch * (self.n_epochs - self.epoch) + self.batches_epoch - self.batch
        sys.stdout.write('ETA: %s' % (datetime.timedelta(seconds=batches_left*self.mean_period/batches_done)))

        # 显示生成图
        for image_name, tensor in images.items(): # 字典.items()是以list形式返回键值对
            if image_name not in self.image_windows:
                self.image_windows[image_name] = self.viz.image(tensor2image(tensor.data), opts={'title':image_name})
            else:
                self.viz.image(tensor2image(tensor.data), win=self.image_windows[image_name], opts={'title':image_name})

        # End of each epoch
        if (self.batch % self.batches_epoch) == 0: # 一个epoch结束时
            # 绘制loss曲线图
            for loss_name, loss in self.losses.items():
                if loss_name not in self.loss_windows:
                    self.loss_windows[loss_name] = self.viz.line(X=np.array([self.epoch]), Y=np.array([loss/self.batch]),
                                                                 opts={'xlabel':'epochs', 'ylabel':loss_name, 'title':loss_name})
                else:
                    self.viz.line(X=np.array([self.epoch]), Y=np.array([loss/self.batch]), win=self.loss_windows[loss_name], update='append') #update='append'可以使loss图不断更新
                # 每个epoch重置一次loss
                self.losses[loss_name] = 0.0
            # 跑完一个epoch,更新一下下面参数
            self.epoch += 1
            self.batch = 1
            sys.stdout.write('\n')
        else:
            self.batch += 1

python第三方库visdom的使用入门教程

train.py中调用代码是

代码如下:



# 绘画Loss图
logger = Logger(opt.n_epochs, len(dataloader))

for epoch in range(opt.epoch, opt.n_epochs):
    for i, batch in enumerate(dataloader):
    	
    	......
		
		# 记录训练日志
            # Progress report (http://localhost:8097) 显示visdom画图的网址
            logger.log({'loss_G': loss_G, 'loss_G_identity': (loss_identity_A + loss_identity_B),
                        'loss_G_GAN': (loss_GAN_A2B + loss_GAN_B2A),
                        'loss_G_cycle': (loss_cycle_ABA + loss_cycle_BAB), 'loss_D': (loss_D_A + loss_D_B)},
                       images={'real_A': real_A, 'real_B': real_B, 'fake_A': fake_A, 'fake_B': fake_B})

python第三方库visdom的使用入门教程

到此这篇关于python第三方库visdom的使用入门教程的文章就介绍到这了,更多相关python visdom使用内容请搜索四海网以前的文章或继续浏览下面的相关文章希望大家以后多多支持四海网!

本文来自:http://www.q1010.com/181/18617-0.html

注:关于python第三方库visdom的使用的深入分析的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:python

您可能感兴趣的文章

  • python可视化hdf5文件的操作的简单示例
  • Python之scipy.misc.imsave()函数的用法示例
  • Python之matplotlib共享坐标轴的实现X或Y坐标轴的简单示例
  • Python之matplotlib.subplot()画子图并共享y坐标轴的简单示例
  • Python给二维码图片添加提示文字的简单示例
  • Python之SciPy中两个模块:io 和misc用法示例
  • python提取word文件中所有图片的简单示例
  • Python之Matplotlib实现subplot和subplots简单对比
  • Python使用scipy保存图片的一些注意示例
  • Python之Matplotlib绘制子图的常见几种简单示例
上一篇:NumPy实现ndarray多维数组操作的简单示例
下一篇:Python之matplotlib共享坐标轴的实现X或Y坐标轴的简单示例
热门文章
  • Python 处理Cookie的菜鸟教程(一)Cookie库
  • python之pandas取dataframe特定行列的简单示例
  • Python解决json.dumps错误::‘utf8’ codec can‘t decode byte
  • Python通过pythony连接Hive执行Hql的脚本
  • Python 三种方法删除列表中重复元素的简单示例
  • python爬虫代码示例
  • Python 中英文标点转换示例
  • Python 不得不知的开源项目解析
  • Python urlencode编码和url拼接实现方法
  • python按中文拆分中英文混合字符串的简单示例
  • 最新文章
    • Python利用numpy三层神经网络的简单示例
    • pygame可视化幸运大转盘的简单示例
    • Python爬虫之爬取二手房信息的简单示例
    • Python之time库的简单示例
    • OpenCV灰度、高斯模糊、边缘检测的简单示例
    • Python安装Bs4及使用的简单示例
    • django自定义manage.py管理命令的简单示例
    • Python之matplotlib 向任意位置添加一个子图(axes)的简单示例
    • Python图像标签标注软件labelme分析的简单示例
    • python调用摄像头并拍照发邮箱的简单示例

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。