热门标签 | 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)》


推荐阅读
  • 如何在Linux系统中部署TensorFlow的详细指南
    本文详细介绍了在Linux系统中部署TensorFlow的过程。作者基于北京大学曹建教授的MOOC课程进行学习,但由于课程内容较旧,环境配置方面遇到了不少挑战。经过多次尝试,最终成功解决了这些问题,并总结了一套详细的安装指南,帮助初学者快速上手TensorFlow。 ... [详细]
  • 深入解析经典卷积神经网络及其实现代码
    深入解析经典卷积神经网络及其实现代码 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 探讨 jBPM 数据库表结构设计的精要与实践
    探讨 jBPM 数据库表结构设计的精要与实践 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 基于OpenCV的图像拼接技术实践与示例代码解析
    图像拼接技术在全景摄影中具有广泛应用,如手机全景拍摄功能,通过将多张照片根据其关联信息合成为一张完整图像。本文详细探讨了使用Python和OpenCV库实现图像拼接的具体方法,并提供了示例代码解析,帮助读者深入理解该技术的实现过程。 ... [详细]
  • 宏基因组学经典文献重现(一):利用ggplot2进行散点图可视化分析
    宏基因组学经典文献重现(一):利用ggplot2进行散点图可视化分析 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • 视觉图像的生成机制与英文术语解析
    近期,Google Brain、牛津大学和清华大学等多家研究机构相继发布了关于多层感知机(MLP)在视觉图像分类中的应用成果。这些研究深入探讨了MLP在视觉任务中的工作机制,并解析了相关技术术语,为理解视觉图像生成提供了新的视角和方法。 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 本文介绍了如何利用摄像头捕捉图像,并将捕获的图像数据保存为文件。通过详细的代码示例,展示了摄像头调用的具体实现方法,适用于多种应用场景,如安全监控、图像处理等。 ... [详细]
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社区 版权所有