首页 > 编程 > Python > 正文

基于TensorBoard中graph模块图结构分析

2020-02-15 18:24:12
字体:
来源:转载
供稿:网友

在上一篇文章中,我们介绍了如何使用源码对TensorBoard进行编译教程,没有定制需求的可以直接使用pip进行安装。

TensorBoard中的graph是一种计算图,里面的点用于表示Tensor本身或者运算符,图中的边则代表Tensor的流动或者控制关系。

本文主要从代码的层面,分析graph的数据来源与结构。

一般来说,我们在启动TensorBoard的时候会使用--logdir参数配置文件路径(或者设置数据库位置),这些日志文件为TensorBoard提供了数据。于是我们打开一个日志文件,查看里面的内容

我们看到,文件是通过二进制展示的,因此无法直接读取文件的内容。

回到浏览器中,进入graph页面,通过开发者工具发现,构造图的时候调用了一个接口

http://localhost:6006/data/plugin/graphs/graph?large_attrs_key=_too_large_attrs&limit_attr_size=1024&run=task1

用浏览器打开这个地址,看到以下内容

node { name: "Input/X" op: "Placeholder" attr { key: "_output_shapes" value {  list {  shape {   unknown_rank: true  }  } } } attr { key: "dtype" value {  type: DT_FLOAT } } attr { key: "shape" value {  shape {  unknown_rank: true  } } }}...

每个node都能够与图中的一个节点相对应,因此我们可以确定,这个接口里返回的node,就是构成图所需要的数据结构。

那么,TensorBoard是如何将日志文件转化为图的呢?

TesnorBoard中的每个模块都是以plugin存在的,我们进入tensorboard/plugin/graph/graphs_plungin.py,在这个文件中定义了graph相关的接口

def get_plugin_apps(self): return {  '/graph': self.graph_route,  '/runs': self.runs_route,  '/run_metadata': self.run_metadata_route,  '/run_metadata_tags': self.run_metadata_tags_route, }

我们可以看到,‘/graph'这个接口返回值为self.graph_route,在这个文件中搜索graph_route方法

 @wrappers.Request.application def graph_route(self, request): """Given a single run, return the graph definition in protobuf format.""" run = request.args.get('run') if run is None:  return http_util.Respond(   request, 'query parameter "run" is required', 'text/plain', 400)  limit_attr_size = request.args.get('limit_attr_size', None) if limit_attr_size is not None:  try:  limit_attr_size = int(limit_attr_size)  except ValueError:  return http_util.Respond(   request, 'query parameter `limit_attr_size` must be an integer',   'text/plain', 400)  large_attrs_key = request.args.get('large_attrs_key', None)  try:  result = self.graph_impl(run, limit_attr_size, large_attrs_key) except ValueError as e:  return http_util.Respond(request, e.message, 'text/plain', code=400) else:  if result is not None:  (body, mime_type) = result # pylint: disable=unpacking-non-sequence  return http_util.Respond(request, body, mime_type)  else:  return http_util.Respond(request, '404 Not Found', 'text/plain',         code=404)            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表