文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
6.6 工具函数
在项目中,我们可能会用到一些 helper 方法,这些方法可以统一放在 utils/
文件夹下,需要使用时再引入。在本例中主要是封装了可视化工具 visdom 的一些操作,其代码如下,在本次实验中只会用到 plot
方法,用来统计损失信息。
#coding:utf8
import visdom
import time
import numpy as np
class Visualizer(object):
'''
封装了 visdom 的基本操作,但是你仍然可以通过`self.vis.function`
或者`self.function`调用原生的 visdom 接口
比如
self.text('hello visdom')
self.histogram(t.randn(1000))
self.line(t.arange(0, 10),t.arange(1, 11))
'''
def __init__(self, env='default', **kwargs):
self.vis = visdom.Visdom(env=env, **kwargs)
# 画的第几个数,相当于横坐标
# 保存(’loss',23) 即 loss 的第 23 个点
self.index = {}
self.log_text = ''
def reinit(self, env='default', **kwargs):
'''
修改 visdom 的配置
'''
self.vis = visdom.Visdom(env=env, **kwargs)
return self
def plot_many(self, d):
'''
一次 plot 多个
@params d: dict (name, value) i.e. ('loss', 0.11)
'''
for k, v in d.items():
self.plot(k, v)
def img_many(self, d):
for k, v in d.items():
self.img(k, v)
def plot(self, name, y, **kwargs):
'''
self.plot('loss', 1.00)
'''
x = self.index.get(name, 0)
self.vis.line(Y=np.array([y]), X=np.array([x]),
win=name,
opts=dict(title=name),
update=None if x == 0 else 'append',
**kwargs
)
self.index[name] = x + 1
def img(self, name, img_, **kwargs):
'''
self.img('input_img', t.Tensor(64, 64))
self.img('input_imgs', t.Tensor(3, 64, 64))
self.img('input_imgs', t.Tensor(100, 1, 64, 64))
self.img('input_imgs', t.Tensor(100, 3, 64, 64), nrows=10)
!!! don't ~~self.img('input_imgs', t.Tensor(100, 64, 64), nrows=10)~~ !!!
'''
self.vis.images(img_.cpu().numpy(),
win=name,
opts=dict(title=name),
**kwargs
)
def log(self, info, win='log_text'):
'''
self.log({'loss':1, 'lr':0.0001})
'''
self.log_text += ('[{time}] {info} <br>'.format(
time=time.strftime('%m%d_%H%M%S'),\
info=info))
self.vis.text(self.log_text, win)
def __getattr__(self, name):
'''
自定义的 plot,image,log,plot_many 等除外
self.function 等价于 self.vis.function
'''
return getattr(self.vis, name)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论