[关闭]
@Team 2018-12-08T12:06:06.000000Z 字数 4232 阅读 2125

在pytorch、keras中自由使用tensorboard的简单方案

刘威威


前言

在这篇博文中,将向你展示如何自由的在任何Python代码中使用Tensorboard。

最近身边的一些朋友们都开始从tensorflow转战Pytorch等,Tensorflow使用静态编译的计算图并在单独的运行时环境中运行大部分应用程序,与Tensorflow相比,PyTorch允许你完全使用Python创建动态计算图,单单动态调试这一点就欲罢不能(真香警告)。

但是tensorflow的孪生兄弟tensorboard实在是有点让人难以舍弃。对于那些不了解Tensorboard的人来说,它是一个可视化工具,用于计算图形,学习进度,神经网络权重或可能需要在一个漂亮的基于Web的环境中绘制的任何内容。 Tensorboard从命令行作为(基于Python)Web服务器运行。它读取外部代码生成的.event文件(如Tensorflow或本文中显示的代码),并在浏览器中显示它们。

tensorboard类的实现

Tensorboard提供以下基本功能:

第一个功能在实现上较为麻烦,但是我们可以很简单的实现后三个功能。直接上代码,后文列出详细解释:

  1. import io
  2. import numpy as np
  3. from PIL import Image
  4. import tensorflow as tf
  5. import skimage
  6. import matplotlib
  7. matplotlib.use("TkAgg")
  8. import matplotlib.pyplot as plt
  9. class Tensorboard:
  10. def __init__(self, logdir):
  11. self.writer = tf.summary.FileWriter(logdir)
  12. def close(self):
  13. self.writer.close()
  14. def log_scalar(self, tag, value, global_step):
  15. summary = tf.Summary()
  16. summary.value.add(tag=tag, simple_value=value)
  17. self.writer.add_summary(summary, global_step=global_step)
  18. self.writer.flush()
  19. def log_histogram(self, tag, values, global_step, bins):
  20. counts, bin_edges = np.histogram(values, bins=bins)
  21. hist = tf.HistogramProto()
  22. hist.min = float(np.min(values))
  23. hist.max = float(np.max(values))
  24. hist.num = int(np.prod(values.shape))
  25. hist.sum = float(np.sum(values))
  26. hist.sum_squares = float(np.sum(values ** 2))
  27. bin_edges = bin_edges[1:]
  28. for edge in bin_edges:
  29. hist.bucket_limit.append(edge)
  30. for c in counts:
  31. hist.bucket.append(c)
  32. summary = tf.Summary()
  33. summary.value.add(tag=tag, histo=hist)
  34. self.writer.add_summary(summary, global_step=global_step)
  35. self.writer.flush()
  36. def log_image(self, tag, img, global_step):
  37. s = io.BytesIO()
  38. Image.fromarray(img).save(s, format='png')
  39. img_summary = tf.Summary.Image(encoded_image_string=s.getvalue(),
  40. height=img.shape[0],
  41. width=img.shape[1])
  42. summary = tf.Summary()
  43. summary.value.add(tag=tag, image=img_summary)
  44. self.writer.add_summary(summary, global_step=global_step)
  45. self.writer.flush()
  46. def log_plot(self, tag, figure, global_step):
  47. plot_buf = io.BytesIO()
  48. figure.savefig(plot_buf, format='png')
  49. plot_buf.seek(0)
  50. img = Image.open(plot_buf)
  51. img_ar = np.array(img)
  52. img_summary = tf.Summary.Image(encoded_image_string=plot_buf.getvalue(),
  53. height=img_ar.shape[0],
  54. width=img_ar.shape[1])
  55. summary = tf.Summary()
  56. summary.value.add(tag=tag, image=img_summary)
  57. self.writer.add_summary(summary, global_step=global_step)
  58. self.writer.flush()
  59. if __name__ == '__main__':
  60. tensorboard = Tensorboard('logs')
  61. x = np.arange(1, 101)
  62. y = 20 + 3 * x + np.random.random(100) * 100
  63. # Log simple values
  64. for i in range(0, 100):
  65. tensorboard.log_scalar('value', y[i], i)
  66. # Log images
  67. img = Image.open('/mnt/sda1/lvv/84504.jpg')
  68. img = np.asarray(img, dtype=np.uint8)
  69. # img = skimage.io.imread('/mnt/sda1/lvv/84504.jpg')
  70. tensorboard.log_image('example_image', img, 0)
  71. # Log plots
  72. fig = plt.figure()
  73. plt.plot(x, y, 'o')
  74. tensorboard.log_plot('example_plot', fig, 0)
  75. plt.close()
  76. # Log histograms
  77. rng = np.random.RandomState(10)
  78. a = np.hstack((rng.normal(size=1000), rng.normal(loc=5, scale=2, size=1000)))
  79. tensorboard.log_histogram('example_hist', a, 0, 'auto')
  80. tensorboard.close()

首先,建立一个tensorboard类,包含四个重要函数:log_scalar,log_image,log_plot和log_histogram。 我们将关注的也是这四个函数。 这些函数可以实现上文叙述的功能。

在程序的main部分,简单的演示了这些函数的用法。 其余的代码非常简单:Tensorboard类通过调用其构造函数来初始化,其中包含日志目录的路径。 构造函数依次初始化FileWriter对象。 在程序结束时,我们必须再次关闭FileWriter。

log_scalar,log_image,log_plot和log_histogram函数都将tag和global_step作为参数。 tag是要绘制的值的任意名称。 例如,你可以为loss函数设置tag ='loss'。 global_step指的是测量特定值的时间,例如时期计数或类似值。 此外,log_scalar接受数值作为其第二个参数。 这是log_scalar生成的示例标量图:
plot

log_image是一个类似的简单函数,它将一个numpy数组作为img参数来绘制任意图像(例如下面的例子):
在这里插入图片描述

log_histogram稍微复杂一些:它使用bin的bin数来计算values参数中给出的值的直方图。 计算本身就是numpy。 然后,它被送到Tensorboard:
在这里插入图片描述

log_plot与log_image非常相似,只是提供的输入不是image,它的figure参数需要是一个matplotlib图。 使用此函数,你可以直接在Tensorboard中显示任意matplotlib figures :
在这里插入图片描述

使用tensorboard

当程序 运行完成后,会在代码所在的文件夹下创建一个文件夹,里面有一个格式的文件,
在这里插入图片描述

在浏览器中打开tensorboard的正确姿势如下:
在当前目录下打开终端,输入命令:

  1. $tensorboard --logdir=logs

如果出现错误,端口不可用等情况,可以指定port参数或者host参数等,参考示例:

  1. $tensorboard --logdir=logs --host=127.0.01 --port=8008

之后就会运行出现一个网络链接,复制粘贴到(google)浏览器中就可以。
命令行里输入下面的代码可以查看tensorboard使用方法:

$tensorboard -h

注: 本文编译自 https://becominghuman.ai/logging-in-tensorboard-with-pytorch-or-any-other-library-c549163dee9e 内容和代码有删改。

原文作者希望通过这篇博文,帮助其他人在切换到另一个框架时可以同样使用tensorboard,而不受任何限制。 作者的GitLab上也有其他有趣的代码和项目,感兴趣的可以查看以下链接:https://gitlab.com/branislav.hollander 其中就包括了作者写的tensorboard使用代码,但是原代码中有一些问题,运行会报错,笔者参考大佬的代码做了一些修改,修复了这些bug,修改后的代码详见下述链接:https://github.com/LDOUBLEV/Tensorboard

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注