首先一如既往地是我们的约定环节:
- TF/TB:TensorFlow/TensorBoard;
第6章 TB可视化工具
6.1 概述
TB Web界面的顶部菜单栏列出了7个功能面板,分别用与展示不同的可视化对象:
- SCALARS面板展示标量值随时间变化的关系图;
- IMAGES和AUDIO面板分别展示图像和音频数据;
- GRAPHS面板展示数据流图;
- DISTRIBUTIONS和HISTOGRAMS面板分别展示向量值的数据分布和统计信息;
- EMBEDDINGS面板用于展示降维后的高维数据;
TensorBoard使用流程
这里使用的FileWriter实例和汇总操作(summary ops)均属于tf.summary模块,而这个模块贯穿TB的整个流程。它的主要功能是获取和输出模型相关的序列化数据,它的核心部分由一组汇总操作以及FileWriter、Summary和Event这3个类组成。
汇总操作(Summary Ops)主要负责获取数据流图上的张量,包括用户定义的度量指标、模型参数、音频和图像数据等。与计算操作不同,它存储的是符合TF项目组预定义数据结构的序列化数据(Protocol Buffers),后者包含的是具体的张量值。
FileWriter类负责向事件文件写入序列化数据,包括汇总数据、事件数据和数据流图等。汇总数据符合summary.proto文件定义的数据结构,表示一组将被可视化的具名数值,比如图像数据、音频数据;事件数据符合event.proto文件定义的数据结构,表示在会话中执行操作时产生的时间信息,包括时间戳、全局步数等;数据流图符合graph.proto文件定义的数据结构,表示当前会话加载的默认数据流图,包括图上所有节点和有向边、图的版本号等。
6.2 可视化数据流图
FileWriter类向时间文件写入的序列化数据之一。
6.2.1 名字作用域与抽象节点
数据流节点可以分为四类:计算节点、存储节点、数据节点和汇总节点。本节引入一个新概念——抽象节点,代表一组特定操作的集合。
6.2.2 可视化数据流图的最佳实践
可以简化为以下三个步骤:
- 创建数据流图;
- 创建FlieWriter实例;
- 启动TensorBoard程序;
代码参见这里。
6.2.3 扩展阅读:汇总数据和事件数据
1. 汇总数据与summary.proto:
汇总数据是tf.summary.Summary类或者其内嵌类的实例。tf.summary.Summary包含3个内嵌类——Image、Audio、和Value。其中Value表示具名数值。
2. 事件数据与event.proto:
事件数据是tf.summary.Event类的实例,事件数据表示在会话中执行操作时产生的时间信息,包括时间戳、全局步数,以及oneof方式定义的具体事件信息。
6.2.4 拓展阅读:揭秘tf.summary.FileWriter工作原理
FileWriter向事件文件中写入的是事件数据,汇总数据和其他的序列化数据一定得转换为事件数据,同时支持并行地更新事件文件。
FileWriter类继承自SummaryToEventTransformer类,FileWriter实例包含event_writer成员对象,后者是EventFileWriter的实例,提供向事件文件中写入事件数据的能力。而且FileWriter支持多线程并行多线程并行更新事件文件,所以它和输入流水线一样需要多个缓存队列来提升效率。
当我们创建FileWriter实例时,它的构造方法会在logdir目录下创建一个事件文件,对于用户显式传入graph参数的情况,因为FileWriter的构造函数内部调用了基类SummaryToEventTransformer的构造方法,所以后者将会调用add_graph成员方法将序列化后的数据流图写入事件文件。
add_*方法会根据flush_secs定期将事件数据缓存队列中的数据写入事件文件,或者用户可以调用flush成员方法,手动刷新事件数据缓存队列。
6.3 可视化学习过程
6.3.1 汇总操作概述
汇总操作也是TF的操作之一(现在总共有4种操作:数据操作、运算操作、存储操作、汇总操作)。为了在会话运行过程中收集这些汇总数据,用户需要添加汇总操作,即在数据流图中添加对应的汇总节点,输出是特定的汇总数据,会带来额外的资源消耗。
6.3.2 使用tf.summary.scalar生成折线图
collections参数的默认值为GraphKeys.SUMMARIES。
6.3.3 使用tf.summary.histogram生成数据分布图
在会话中执行tf.summary.histogram操作,可以获取一条带有统计值的汇总数据。输入参数与tf.summary.scalar操作类似,分别是name、value和collections,可以用于查看学习过程中模型权重值的数据分布和统计信息。
6.3.4 使用tf.summary.image生成图像
执行tf.summary.image操作,可以获取一条带有图像的汇总数据。输入参数必须是形如[batch_size, height, width, channels]的四阶张量,表示一批图像数据。通道数可选1、3、4表示灰度、RGB和RGBA。
6.3.5 使用tf.summary.audio生成音频
在会话中执行tf.summary.audio操作,可以获取一条带有音频的汇总数据,必须是形如[batch_size, frames, channels]的三阶张量或形如[batch_size, frames]的二阶张量。
6.4 可视化高维数据
6.4.1 使用TensorBoard可视化高维数据
TB可视化高维数据的模块叫做嵌入投射议(embedding projector),打开Emeddings面板可看。它内置t-SNE(t-Distributed Stochastic Neighbor Embedding)和主成分分析(Principal Component Analysis,PCA)两种降维方法,也支持用户自定义降维算法,是集成的第三方模块,核心在于3类对象和3种文件的使用。3类对象分别是嵌入变量、嵌入变量元数据和投影配置参数。保存它们的3种文件分别是checkpoint文件、元数据文件和投影配置文件。
- 嵌入变量:它是待可视化数据载体,TB要求用户使用形如 [ 嵌入数据总数,嵌入数据维度 ] 的二阶张量表示想要可视化的高维数据。
- 嵌入变量元数据:用于描述嵌入变量中每个元素的数据特征集合。TF推荐使用TSV(Tab-Seperated Value,区别于CSV)文件格式保存嵌入变量元数据,由于变量元数据在训练过程中不会更新(思考:为什么?回答:相当于训练数据)。
- 投影配置参数:用于指定TB可视化高维数据时所使用的嵌入变量及其元数据,以Protocol Buffer序列化格式保存的文本文件中,这些配置主要包括嵌入变量名称tensor_name、元数据文件路径metadata_path和全景图配置sprite等,投影配置文件命名为projector_config.pbtxt。
对于表示图像的嵌入变量,TB还支持为其添加对应的图像文件,TF官方包含了MNIST数据集中全部10000张手写体数字全景图,称为sprite image。总结TB可视化高维数据的流程,可以分为4步:
- 创建嵌入变量,并保存到checkpoint文件;
- 创建嵌入变量元数据,并保存到元数据(通常命名为metadata.tsv);
- 设置投影配置参数,保存到投影配置文件(通常命名为projector_config.pbtxt);
- 运行TB程序,加载上面生成的3个文件,可视化投影结果。
6.5 小结
Embedding模块在高维数据下的降维,采用PCA往往获得不了什么有价值的信息,只能粗略的观察到聚集的效果,可能需要适当的前处理。以MNIST数据集为例,使用t-SNE可以获得比PCA更好的效果。
在新版本的TF中,embedding被命名为projector,找不到embedding的小伙伴可以在右上角下来菜单下选择projector。