python第三方库visdom的使用入门教程
作者:All_In_gzx_cc 发布时间:2021-12-08 22:32:51
标签:python,visdom
概述
Visdom:一个灵活的可视化工具,可用来对于 实时,富数据的 创建,组织和共享。支持Torch和Numpy还有pytorch。
visdom
可以实现远程数据的可视化,对科学实验有很大帮助。我们可以远程的发送图片和数据,并进行在ui界面显示出来,检查实验结果,或者debug.
要用这个先要安装,对于python模块而言,安装都是蛮简单的:
pip install visdom
安装完每次要用直接输入代码打开:
python -m visdom.server
然后根据提示在浏览器中输入相应地址即可,默认地址为: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
其中:
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))
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))
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))
持续更新图表
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')
使用“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'})
绘制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'
)
对于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
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})
来源:https://blog.csdn.net/All_In_gzx_cc/article/details/116998959
0
投稿
猜你喜欢
- 当然有,看看下面,你就会明白:<%Sub TimeDelaySeconds(Delay
- 一、用HTTP头信息 也就是用PHP的HEADER函数。PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WE
- 1. 如何停止任务?我们可以通过 asyncio.Task 对象上的 cancel() 方法取消任务。如果任务被取消,cancel() 方法
- 关于target="_blank"去留的问题在网上已经被反复争议很多次了。有的说要留,有的说要去掉。主张留的一方主要是考
- 在输入框里面预设一段提示文字,当焦点在输入框的时候清空这段文字,这在目前来说已经不是什么新鲜事了。淘宝的搜索框就用到了这样一种设计:这种设计
- 本文实例讲述了PHPExcel冻结(锁定)表头的简单实现方法。分享给大家供大家参考,具体如下:PHPExcel是一款功能比较强大的操作微软e
- 很多网站现在都有使用QQ作为在线客服工具,我们点击它可以很方便的和网站人员联系,本站为你整理了在网站上使用QQ在线客服的代码,共13种风格,
- 当py文件中引用了库face_recognition但是python中没有安装这个库的时候,就会出现No module named '
- ASP 本身不支持动态包含文件,现在的动态包含是通过 FSO 把被包含的文件合并到主文件里再运行。以下也有把形如 <!--#
- 一、安装MySQL 目前web服务器已经很少有跑静态页面
- 尽管甲骨文收购Sun交易尚在等待最终结果,业界对开源数据库MySQL的未来命运也十分担忧,但Sun的开发者依然在继续努力研发该开源数据库。他
- 本文介绍使用ADODB.Stream组件来下载服务器文件,例如:download.asp?file=相对路径的文件。就可以把这个文件下载下来
- 在进行matplotlib画图的时候,经常会出现这个的报错,虽然知道是因为没有对应的字体的原因,但是,将字体下载后放到目标路径下,仍然没有办
- 前言激活函数在机器学习中常常用在神经网络隐含层节点与神经网络的输出层节点上,激活函数的作用是赋予神经网络更多的非线性因素,如果不用激励函数,
- yolov5返回坐标(v6版)1 、从yolov5文件夹李找到detect.py,按Ctrl+F 输入annotator.box_label
- 我就废话不多说了,大家还是直接看代码吧!import pandas as pddef get_under_rolling(df,window
- 删除单条记录 代码如下:id = saferequest("id") sql="
- 生成一列sum_age 对age 进行累加df['sum_age'] = df['age'].cumsum(
- 一:input()函数的输入机制我们编写的大部分程序,都需要读取输入并对其进行处理,而基本的输入操作是从键盘键入数据。Python从键盘键入
- 或许你也经历过,很多人都说一个女人很漂亮,而你觉得很一般。有时候,我也尝试理解为什么会对某个女人情有独钟。通常,我用迷人来描述,但这个&qu