热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tensorflow入门教程(10)

上次文章:闫17:Tensorflow入门教程(9)​zhuanlan.zhihu.com本次对应代码:https:github.comSaoYanLearningTensorfl

上次文章:

闫17:Tensorflow入门教程(9)zhuanlan.zhihu.com《Tensorflow入门教程(10)》

本次对应代码:

https://github.com/SaoYan/LearningTensorflow/blob/master/exp08_Embedding_Visualization.pygithub.com

官方文档参考阅读:

https://www.tensorflow.org/versions/master/programmers_guide/embeddingwww.tensorflow.org
https://www.tensorflow.org/versions/r1.2/get_started/embedding_vizwww.tensorflow.org

同步连载于个人公众号“SaoYan”

What is embedding

简单来说,embedding就是实体对象的数值化表示。“实体对象”可以是image、word等,“数值化表示”就是一个编码向量。例如对“颜色“这种实体对象用(R,G,B)这样一个三元素向量编码。

embedding还可以理解成将离散目标投影到连续空间中的某个点上。

数值化的embedding vector本身是没有意义的,不同vector之间的相对关系才是有实际意义的

例如:NLP中最基本的word embedding,给每一个单词一个N维编码向量(或者说将每个word投影到N维空间中),我们期望这种编码满足这样的特性:两个向量之间的”距离“越小,代表这两个单词含义越接近。我们甚至可能期望更复杂的特性,例如能够在这个N维空间中找到一个代表”性别“的超平面,使相反性别的单词合理的分布在这个超平面两侧(比如“boy”和“girl”是关于这个超平面对称的)。

embedding的用处很多,还是用word embedding做例子,如果我们找到了一种能够具有优良性质的编码,那么这组编码就可以作为理解语言的一个重要工具。例如通过判别单词相对于“性别超平面”的位置来获取“gender bias”信息。

可以类比一下高中的立体几何:当复杂的逻辑推理简化成精炼的空间向量运算的时候,立体几何的求解问题大大简化了。数值运算对于计算机来说也是一种可操作的目标了。

如果想利用embedding,前提是这个“编码”质量本身够好,或者说足够适合我们的应用需求,例如在OpenCV的推送中我们提到过在RGB空间进行直方图反投影效果远远不如HSV空间。也就是说,同样的一组颜色,在不同的编码方式下,特性和应用场合差异很大。

围绕embedding展开的两个经典研究领域至今还在贡献着热量

(1)如何构建这样的编码?比如在NLP领域经典的word embedding问题,单单是“如何编码”这个小问题,就吸引了无数学者,其中不乏Geoffrey Hinton,Yoshua Bengio这样的学术泰斗。

(2)如何度量两个embedding vector之间的相似度?有了编码,我们需要度量两个编码之间的“距离”。我们熟悉的欧氏距离在很多情境下是完全失效的,这时候,定义一种更符合需求的“距离”就是很有必要的(度量学习)

扯了这么多之后,还想多一句嘴:深度学习只是机器学习中的一员,机器学习本身有太多内涵,主页菌本人水平有限并没有深入研究过什么,但是作为入坑之人,还是要时刻保持冷静,不要“非深度学习不用”,否则会错过很多风景哒!

How to visualize embedding?

利用Tensorboard很容易将embedding进行可视化,不过既然是可视化,最高只能“可视”三维空间,所以高维向量需要被投影到三维(或二维空间)。不过不用担心细节,Tensorboard做了足够高质量的封装。

这次的代码基于教程5,只需要增加10行左右的代码就可以将embedding可视化添加进Tensorboard中。

  • overview

为了代码思路足够简单,我们不去计算任何embedding vector,而是用图片数据本身作为embedding(将图片展开成向量)。实际应用中将这部分数据替换成你自己的embedding就可以啦。

可视化embedding有两个要素:

(1)被可视化的数据本身,也就是可视化空间中的每一个数据点

(2)metadata,也就给每一个数据点赋予的“标签”。metadata需要单独存放在tsv文件中。

在正式代码开始之前,需要导入一个额外的模块:

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

  • step 1:准备数据

首先是被可视化的数据本身,在这里就是MNIST的测试图像。注意embedding可视化的数据需要是tf.Variable类型

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

其次是将metadata存储在单独的tsv文件中。这里我们就使用MNIST测试集的label,将他们存储在tsv中。tsv文件中每一行代表一个数据的metadata

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

存储完的tsv文件是这样的:

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

  • step 2:构造embedding

有了数据对象和metadata之后,我们需要告诉程序这么三件事

(1)我需要构建一个embedding用来可视化

(2)embedding中的数据是什么

(3)embedding中的metadata是什么

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

高亮部分的三行代码就是分别做了上面说的那三件事。

  • step 3:写入Tensorboard

将可视化对象写入Tensorboard用到了tf.summary(请回顾教程5)

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

我们使用了两组summary,因为在训练集和测试集上的结果要分开。在将embedding加入Tensorboard的时候我们需要告诉程序要加入到哪一个summary中去

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

注意高亮部分指定了加入哪个summary。

至此,大功告成!

Enjoy!

来载入Tensorboard看效果吧

进入“PROJECTOR”这个标签

在左侧选择“test”,因为我们的embedding加入的是这个summary

《Tensorflow入门教程(10)》

这时候你看到的是这样的:

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

然后使用metadata给数据点标记不同的颜色。在左侧选择“color map”,也就是我们存储的metadata:

《Tensorflow入门教程(10)》

现在你看到的效果变成了这样:

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

在左下角有这么一个面板:

《Tensorflow入门教程(10)》

这个面板是用来选择数据降维算法的。Tensorboard提供了PCA和t-SNE两种。PCA就是我们熟悉的主成分分析,是默认选择的降维算法,上面的效果图都是PCA降维得到的。值得一提的是t-SNE,这是Hinton老爷子提出来的算法,做高维数据降维可可视化简直不要太惊艳!不过缺点是有很多需要调节的参数。

使用如下参数配置:

《Tensorflow入门教程(10)》

迭代稳定之后获得了这样的效果:

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

各个类别的数据点基本上各自聚拢到了一起!

注:

t-SNE是带有随机性的算法,每次运行结果可能不完全一样

关于t-SNE参数调节的一些经验性的总结请看这篇博文:

How to Use t-SNE Effectivelydistill.pub《Tensorflow入门教程(10)》


推荐阅读
  • 本文探讨了图像标签的多种分类场景及其在以图搜图技术中的应用,涵盖了从基础理论到实际项目实施的全面解析。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • OBS (Open Broadcaster Software) 架构解析
    本文介绍 OBS(Open Broadcaster Software),一款专为直播设计的开源软件。文章将详细探讨其技术架构、核心组件及其开发环境要求。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 1.基本原理边缘检测一般是利用微分等方法,通过对灰度跃变的分析寻找图像上区域边缘的技术。今天的猪脚是梯度算子和Roberts算子。1.梯度算子是怎么来的? ... [详细]
  • 本文介绍如何在 Visual Studio Code 中使用 Jupyter Notebook 插件,包括创建、编辑和运行笔记本的基本操作。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • 本文探讨了在Git子模块目录中运行pre-commit时遇到的错误,并提供了一种通过Docker环境解决此问题的方法。 ... [详细]
  • 使用原生 AJAX 处理文件下载与 IE 浏览器图片显示问题
    本文探讨了如何利用原生 AJAX 实现文件的 POST 或 GET 请求下载,并监控下载状态。同时,针对 IE 浏览器及部分移动设备浏览器因路径问题导致图片无法正常显示的情况,提供了有效的解决方案。 ... [详细]
author-avatar
世界第一1945_307
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有