Loading [MathJax]/jax/input/TeX/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TensorBoard Projector 简易指南

TensorBoard Projector 简易指南

作者头像
Alan Lee
发布于 2022-05-10 12:56:10
发布于 2022-05-10 12:56:10
1.7K00
代码可运行
举报
文章被收录于专栏:Small CodeSmall Code
运行总次数:0
代码可运行

原文发表在 TensorBoard Projector 简易指南 - Alan Lee

TensorBoard(TB)是一个非常棒的模型可视化工具,早期我也写过一篇文章来详细介绍各个面板。

不过士别三日,当刮目相待。现在的 TB 和那时相比变化太多了,增加了许多功能面板,绝大部分我都还没怎么用过。其中最吸引我的面板之一就是 Projector,虽然我现在工作中并不怎么用到。

现在终于抽出时间,来完整体验并写一篇 TensorBoard Projector(TBP)的简易教程。

本文将会从原始文本出发(中文),经过训练 embedding、生成所需文件等步骤,一步一步,最终使用 TBP 来可视化 embedding,并解决中文标签不能显示的问题。

我们先来看下最终效果:

虽然说现在 BERT 等预训练模型大行其道,但我还是想从更“复古”的词向量出发。当然如果你想使用 BERT 来生成 embedding,也是完全没有问题的,框架是相同的。

此外,这个过程和你所使用的库无关,无论你是 Numpy、Scipy 还是 TensorFlow、PyTorch,只要能够得到 embedding 向量,那就都没有问题。

使用 TBP 可视化 embedding 的基本逻辑是很简单的:

  1. 得到一些词及其 embedding。
  2. 将他们按照 TBP 认可的对应关系放到文件中。
  3. TBP 读取文件并可视化。

相应的我们需要下列文件:

  1. 原始文本和 embedding 模型:用以得到词及其 embedding。
  2. metadata.tsvtensor.tsvsprite.jpg:分别用于存放词、embedding 和词对应的图片(当然也可以是 PNG),最后一个用于解决中文标签不能显示的问题。
  3. projector_config.pbtxt:用于告诉 TBP 上述文件的位置以及其他配置。

下面我们就来一步一步看如何得到这些文件。

词及词向量

对原始文本使用 spacy 分句,共得到约 38 万句子。然后使用 jieba 和自定义词典进行分词,得到tokenized_sents.txt,该文件格式是一行一个分词后的句子,词之间空格分隔。词向量使用 gensim 的fasttext模型训练得到,维度 300。为减少词的数量,去掉停用词。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Train embeddings
model = FastText(vector_size=300, window=5, min_count=10)
model.build_vocab(corpus_file='tokenized_sents.txt')
model.train(corpus_file='tokenized_sents.txt', total_examples=model.corpus_count, epochs=10, total_words=model.corpus_total_words)
model.save('fasttext.model')

metadata.tsv 和 tensor.tsv

metadata.tsv 的常见格式有两种:没有表头,只有一列;有表头,有两列。前者(格式 1)就是 NLP 中常见的 vocab.txt 的格式,一行一个词。后者(格式 2)的两列一般表示 index 和 label。label 就表示该样本所属的标签,一般多见于分类数据集。实际上格式 1 是格式 2 的特例,相当于默认认为其行号就是 index,行内容就是 label。

metadata.tsv 也可以有多列,多出来的列可以用来表示其他属性信息。

tensor.tsv 用于存储与 metadata.tsv 对应的 embeddings。顺序必须一致,即 metadata.tsv 中第 i 行的词,其 embedding 也必须是 tensor.tsv 中的第 i 行。embedding 中的数字用 \t 分隔。

接上,我们得到模型后,使用其得到的 vocab 及对应的 embedding 来生成这两个文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stopwords = Path("hit_stopwords.txt").read_text(encoding="utf8").splitlines()
model = FastText.load("fasttext.model")
words = [word for word in model.wv.key_to_index.keys() if word not in stopwords]  # 排除掉停用词
logdir = Path('projector/')  # 文件存储目录

metadata_filename = 'metadata.tsv'
lines = ["index\tlable"]  # 此处我们存成两列,你也可以不要表头,只存词
for i, word in enumerate(words):
    lines.append(f"{i}\t{word}")
logdir.joinpath(metadata_filename).write_text("\n".join(lines), encoding="utf8")

tensor_filename = 'tensor.tsv'
lines = ["\t".join(map(str, model.wv[word])) for word in words]
logdir.joinpath(tensor_filename).write_text("\n".join(lines), encoding="utf8")

sprite.jpg

正如开头给出的效果图一样,图中每个点都是有一个 label 的,这个 label 就是词。如果我们直接这样启动 tensorboard,会看到如下页面:

Projector 默认页面,不显示 3D 标签

但启用 3D 标签模式的话,我们将会看到下图所示的样子:

点击左上角的“A”开启 3D 标签模式后

我们可以看到所有的中文词都不见了,只剩下了数字字母等标签。

这是因为 tensorboard 目前还不支持所有 Unicode 字符标签,只支持 ascii 字符。

BUT!关闭 3D 标签模式后,如果你点击其中一个点,你会惊奇地发现又能显示中文标签了: {% image https://s2.loli.net/2021/12/18/ft6WZmqrhuUdXTP.png “中文标签又回来了” %}

一个 workaround 是将汉字转成图片,用图片来作为 label,就像官方给出的 mnist 例子一样:

官方 Mnist 例子

但是由于每个词所含字的数量都不同,同时又需要尽量让词铺满整个图片,所以不同图片中字的 fontsize 都是不同的,需要视情况调整,这是一个迭代的过程。而转图片我们可以借助 PIL 来完成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def text2image(text, imgfile):
    image = Image.new("RGB", (50, 50), color=(255, 255, 255))
    draw = ImageDraw.Draw(image)
    fontsize = 1  # starting font size
    fontpath = "simhei.ttf"

    # portion of image width you want text width to be
    img_fraction = 0.9

    font = ImageFont.truetype(fontpath, fontsize)
    while (font.getsize(text)[0] < img_fraction * image.size[0]) and (
        font.getsize(text)[1] < img_fraction * image.size[1]
    ):
        # iterate until the text size is just larger than the criteria
        fontsize += 1
        font = ImageFont.truetype(fontpath, fontsize)

    # optionally de-increment to be sure it is less than criteria
    fontsize -= 1
    font = ImageFont.truetype(fontpath, fontsize)

    # print('final font size',fontsize)
    draw.text((0, 0), text, font=font, fill=(0, 0, 0))  # put the text on the image
    image.save(imgfile)  # save it

当我们把所有词都转成图片后,再将这些图片,按照一定规则拼接到一起,最终形成的这么一个大图,就是所谓的 sprite.jpg

Sprite Image

Mnist 例子中的 sprite image

那么按照什么规则来拼接呢?

sprite.jpg 必须是正方形,每个小图也最好是正方形,意味着行列上的小图数量必须是相等的,而且 tensorboard 读这个 sprite 的时候是按照行优先的顺序读的。所以假设你有 8 张小图,那么最终的摆放顺序就是下面这样:

8 张小图时的摆放顺序

最后那一格是空白的,也就是全白。

当然也有可能最后一行都是空白的,例如你有 5 张小图,那么要想每行每列上的小图数量是一样的,那么每行每列上就得有 3 张小图:

5 张小图时的摆放顺序

这样不仅第二行最后一格是空白的,就连第三行整行都是空白的。

所以总结来说,假设你有 n 张小图,那么每行每列上小图的数量就是n ,即根号 n 然后上取整。

具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def text2image(text, imgfile):
    image = Image.new("RGB", (50, 50), color=(255, 255, 255))
    draw = ImageDraw.Draw(image)
    fontsize = 1  # starting font size
    fontpath = "simhei.ttf"

    # portion of image width you want text width to be
    img_fraction = 0.9

    font = ImageFont.truetype(fontpath, fontsize)
    while (font.getsize(text)[0] < img_fraction * image.size[0]) and (
        font.getsize(text)[1] < img_fraction * image.size[1]
    ):  # 保证词在行列上均不超出图片范围
        # iterate until the text size is just larger than the criteria
        fontsize += 1
        font = ImageFont.truetype(fontpath, fontsize)

    # optionally de-increment to be sure it is less than criteria
    fontsize -= 1
    font = ImageFont.truetype(fontpath, fontsize)

    # print('final font size',fontsize)
    draw.text((0, 0), text, font=font, fill=(0, 0, 0))  # put the text on the image
    image.save(imgfile)  # save it

projector_config.pbtxt

在得到了 metadata.tsvtensor.tsvsprite.jpg 后,我们还需要告诉 tensorboard 这些文件的位置和每个小图的维度,所以我们需要一个 .pbtxt 文件来指定这些信息。

我们可以用以下程序来生成该文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from tensorboard.plugins import projector

config = projector.ProjectorConfig()
embedding = config.embeddings.add()
embedding.metadata_path = metadata_filename
embedding.tensor_path = tensor_filename
embedding.sprite.image_path = sprite_filename
embedding.sprite.single_image_dim.extend([unit_dim, unit_dim])  # unit_dim 就是小图维度
projector.visualize_embeddings(logdir, config)

然后就会得到一个名为 projector_config.pbtxt 的文件,文件内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
embeddings {
  metadata_path: "metadata.tsv"
  sprite {
    image_path: "sprite.jpg"
    single_image_dim: 50
    single_image_dim: 50
  }
  tensor_path: "tensor.tsv"
}

当然你也可以按照这个格式直接手动创建这个文件。

启动

万事俱备,只欠东风。

现在我们终于可以启动 tensorboard 了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ tensorboard --logdir=projector/

projector/ 就是你上面指定的 logdir

然后根据提示在浏览器打开 http://localhost:6006/#projector 就可以看到页面了,你可以在这里尝试不同降维算法的效果,也可以点击或搜索图上的词来查看其相似词,大致评估下 embedding 的效果。

“捷克共和国”的近义词

扩展

Embedding Projector 中的点不仅仅可以是图像、词,理论上只要是可以 embedding 的东西,就可以显示。而且你懂的,万物皆可 embedding……😂

Reference

END

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TensorFlow-7-TensorBoard Embedding可视化
学习资料 https://www.tensorflow.org/get_started/summaries_and_tensorboard 今天来看 TensorBoard 的一个内置的可视化工具 Embedding Projector, 是个交互式的可视化,可用来分析诸如 embeddings 的高维数据。 embedding projector 将从你的 checkpoint 文件中读取 embeddings。 默认情况下,embedding projector 会用 PCA 主成分分析方法将高维
杨熹
2018/04/03
1.8K0
TensorFlow-7-TensorBoard Embedding可视化
tensorboard快速上手教程
tensorboard可对网络和各种参数进行可视化,可以方便的进行网络结构调整和调参,尤其是应对复杂网路,下面用一个例子介绍tensorboard在Linux中的使用方法。
狼啸风云
2019/01/18
1.9K0
Python制作字符画(pillow,numpy的使用)
简介:本文讲解,如何使用python制作字符画,这里使用的是pillow和numpy这两个python的库。
GeekLiHua
2025/01/21
1530
Python制作字符画(pillow,numpy的使用)
【深入研究】使用RNN预测股票价格系列二
接昨天的 系列一(可点击查看) 在系列一的教程中,我们想继续有关股票价格预测的主题,并赋予在系列1中建立的具有对多个股票做出响应能力的RNN。 为了区分不同价格序列之间相关的模式,我们使用股票信号嵌入
量化投资与机器学习微信公众号
2018/01/29
1.5K0
【深入研究】使用RNN预测股票价格系列二
tensorflow(四十八): 使用tensorboard可视化训练出的文本embedding
对应 tensorflow 1.15版本 log_dir = "./logdir" metadata_path = os.path.join(log_dir, 'metadata.csv') names = ["苹果", "香蕉"] embs = [[1.0, 2.0, 0.1, 0.4], [1.0, 1.0, 0.1, 0.4]] # 1. 写 metadata.csv. 这里存的是对应的 embedding的 文本 with open(metadata_path, "w") as f:
ke1th
2022/10/04
2550
一文教你实现skip-gram模型,训练并可视化词向量
在本教程中,我将展示如何在Tensorflow中实现一个Word2Vec(Word2Vec是从大量文本语料中以无监督的方式学习语义知识的一种模型,它被大量地用在自然语言处理中)的skip-gram模型,为你正在使用的任何文本生成词向量,然后使用Tensorboard将它们可视化。 我在text8数据集上训练了一个skip-gram模型。然后,我用Tensorboard来设想这些Embedding,Embedding其实就是一个映射,将单词从原先所属的空间映射到新的多维空间中,也就是把原先词所在空间嵌入到一个
AiTechYun
2018/03/06
2K0
一文教你实现skip-gram模型,训练并可视化词向量
TensorBoard的最全使用教程:看这篇就够了
机器学习通常涉及在训练期间可视化和度量模型的性能。有许多工具可用于此任务。在本文中,我们将重点介绍 TensorFlow 的开源工具套件,称为 TensorBoard,虽然他是TensorFlow 的一部分,但是可以独立安装,并且服务于Pytorch等其他的框架。
deephub
2022/03/12
37.8K0
TensorBoard的最全使用教程:看这篇就够了
[置顶] 用python生成验证码图片
基本上大家使用每一种网络服务都会遇到验证码,一般是网站为了防止恶意注册、发帖而设置的验证手段。其生成原理是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR)。下面就详细讲解如何生成验证码。
代码伴一生
2021/11/02
1.7K0
Tensorboard 高维向量可视化
[1]Tensorflow实战Google深度学习框架: https://github.com/caicloud/tensorflow-tutorial/tree/master/Deep_Learning_with_TensorFlow/1.4.0
演化计算与人工智能
2020/08/14
1.6K0
Tensorboard 高维向量可视化
使用Tensorboard投影进行高维向量的可视化
Tensorflow是最受欢迎的免费开放源代码机器学习库之一,可帮助您执行各种机器学习和深度学习项目。它可以用于各种任务,包括训练,推理,可视化ML和DL模型。它还提供了各种各样的预训练模型。
deephub
2021/05/18
1.5K0
使用Tensorboard投影进行高维向量的可视化
词向量可视化--[tensorflow , python]
#!/usr/bin/env python # -*- coding: utf-8 -*- """ ---------------------------------- Version : ??
Gxjun
2018/12/28
1.8K0
Tensorboard详解(下篇)
编辑 | 磐石 出品 | 磐创AI技术团队 【磐创AI导读】:本文接续Tensorboard详解(上篇)介绍Tensorboard和总结Tensorboard的所有功能并有代码演练。欢迎大家点击上方蓝字关注我们的公众号:磐创AI。 1. Tensorflow监控指标可视化 除了GRAPHS栏目外,tensorboard还有IMAGES、AUDIO、SCALARS、HISTOGRAMS、DISTRIBUTIONS、FROJECTOR、TEXT、PR CURVES、PROFILE九个栏目,本小节将详细介绍这些
磐创AI
2018/07/03
1.9K0
树莓派4B驱动1.8寸ST7735S TFT屏幕
用到的第三方库的官方文档:Introduction — Luma.LCD: Display drivers for PCD8544, ST7735, ST7789, HT1621, UC1701X, ST7567, ILI9341, ILI9486, HD44780 2.9.0 documentation
小锋学长生活大爆炸
2021/10/08
1.7K0
Django实战-信息资讯-图形验证码
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/07/18
6020
Django实战-信息资讯-图形验证码
纯代码系列:Python实现验证码图片(PIL库经典用法用法,爬虫12306思路)
现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一。这里就不详细介绍了,相信大家都遇到过。
用户2966292
2020/10/23
8120
震惊!为了欣赏后宫的3000佳丽,我竟然用Python做出了一面墙?
博主准备了某群中新认识的110位朋友的头像进行操作(为了保命,博主没有摆出3000佳丽,原理相同,同志们自己观赏即可),下面开始筑墙吧!
数据山谷
2021/06/07
5310
如何使用Python生成跑马灯视频
首先,我们需要安装opencv-python和Pillow两个库。您可以使用以下命令来安装它们:
九狼
2023/08/10
2890
如何使用Python生成跑马灯视频
Python之PIL生成验证码
前言 网站为例防止恶意注册、发帖等恶意操作而设置了验证码,其原理是将一串随机产生的数字或字母生成一幅图片,图片上加一下干扰元素。本文介绍利用python生成一个验证码,其中代码做了注释并于相关知识的解答
全栈程序员站长
2022/06/29
4890
Python之PIL生成验证码
Keras 模型中使用预训练的 gensim 词向量和可视化
在这篇 [在Keras模型中使用预训练的词向量](https://keras-cn.readthedocs.io/en/latest/blog/ word_embedding/) 讲述了如何利用预先训练好的 GloVe 模型,本文基本大同小异。只写一些不同的地方,更想的可以看这篇文章。
大数据技术与机器学习
2021/04/01
1.5K0
Keras 模型中使用预训练的 gensim 词向量和可视化
开发必学的验证码,教你从零写一个验证码
这周一小胖大佬写了一篇《2000字谏言,给那些想学Python的人,建议收藏后细看!》给大家讲了如何快速学习python。
猴哥yuri
2019/09/02
1.1K1
开发必学的验证码,教你从零写一个验证码
推荐阅读
相关推荐
TensorFlow-7-TensorBoard Embedding可视化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档