在Pytorch和Keras等框架上自由使用tensorboard

前言

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

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

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

tensorboard类的实现

Tensorboard提供以下基本功能:

  • 可视化Tensorflow图
  • 绘制一个简单的值(如学习率)
  • 绘制图像(例如激活图)
  • 绘制直方图。

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

import io
import numpy as np
from PIL import Image
import tensorflow as tf
import skimage
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt

class Tensorboard:
    def __init__(self, logdir):
        self.writer = tf.summary.FileWriter(logdir)

    def close(self):
        self.writer.close()

    def log_scalar(self, tag, value, global_step):
        summary = tf.Summary()
        summary.value.add(tag=tag, simple_value=value)
        self.writer.add_summary(summary, global_step=global_step)
        self.writer.flush()

    def log_histogram(self, tag, values, global_step, bins):
        counts, bin_edges = np.histogram(values, bins=bins)

        hist = tf.HistogramProto()
        hist.min = float(np.min(values))
        hist.max = float(np.max(values))
        hist.num = int(np.prod(values.shape))
        hist.sum = float(np.sum(values))
        hist.sum_squares = float(np.sum(values ** 2))

        bin_edges = bin_edges[1:]

        for edge in bin_edges:
            hist.bucket_limit.append(edge)
        for c in counts:
            hist.bucket.append(c)

        summary = tf.Summary()
        summary.value.add(tag=tag, histo=hist)
        self.writer.add_summary(summary, global_step=global_step)
        self.writer.flush()

    def log_image(self, tag, img, global_step):
        s = io.BytesIO()
        Image.fromarray(img).save(s, format='png')

        img_summary = tf.Summary.Image(encoded_image_string=s.getvalue(),
                                       height=img.shape[0],
                                       width=img.shape[1])

        summary = tf.Summary()
        summary.value.add(tag=tag, image=img_summary)
        self.writer.add_summary(summary, global_step=global_step)
        self.writer.flush()

    def log_plot(self, tag, figure, global_step):
        plot_buf = io.BytesIO()
        figure.savefig(plot_buf, format='png')
        plot_buf.seek(0)
        img = Image.open(plot_buf)
        img_ar = np.array(img)

        img_summary = tf.Summary.Image(encoded_image_string=plot_buf.getvalue(),
                                       height=img_ar.shape[0],
                                       width=img_ar.shape[1])

        summary = tf.Summary()
        summary.value.add(tag=tag, image=img_summary)
        self.writer.add_summary(summary, global_step=global_step)
        self.writer.flush()


if __name__ == '__main__':
    tensorboard = Tensorboard('logs')
    x = np.arange(1, 101)
    y = 20 + 3 * x + np.random.random(100) * 100

    # Log simple values
    for i in range(0, 100):
        tensorboard.log_scalar('value', y[i], i)

    # Log images
    img = Image.open('/mnt/sda1/lvv/84504.jpg')
    img = np.asarray(img, dtype=np.uint8)
    # img = skimage.io.imread('/mnt/sda1/lvv/84504.jpg')
    tensorboard.log_image('example_image', img, 0)

    # Log plots
    fig = plt.figure()
    plt.plot(x, y, 'o')

    tensorboard.log_plot('example_plot', fig, 0)
    plt.close()
    # Log histograms
    rng = np.random.RandomState(10)
    a = np.hstack((rng.normal(size=1000), rng.normal(loc=5, scale=2, size=1000)))
    tensorboard.log_histogram('example_hist', a, 0, 'auto')

    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

当程序 运行完成后,会在代码所在的文件夹下创建一个/logs文件夹,里面有一个events格式的文件,

在这里插入图片描述

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

$tensorboard  --logdir=logs   

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

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

之后就会运行出现一个网络链接,复制粘贴到(google)浏览器中就可以。

注: 本文编译自 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容