【问题标题】:Generating a *simple* TensorFlow graph illustration生成*简单* TensorFlow 图说明
【发布时间】:2018-01-27 17:16:24
【问题描述】:

我正在 Jupyter 笔记本中使用 TensorFlow 开发我的第一个深度学习模型,我想生成简化的图表来说明网络的各个层.具体来说,如this answer 中所示的图表:

这是非常简单和干净的,我可以理解发生了什么。这比捕获 100% 的细节更重要。对比 TensorBoard 生成的图表,这是一个完整的 fustercluck:

如何获取tf.Graph 对象并自动生成与上述类似的图形?如果它也可以在 Jupyter Notebook 中显示,则可以加分。

【问题讨论】:

    标签: tensorflow deep-learning visualization jupyter-notebook tensorboard


    【解决方案1】:

    简而言之 - 你不能。 TF 是一个低级库,它没有“高级操作”的概念,它有操作,这是它唯一可以以您正在考虑的方式可视化的东西。特别是,从数学的角度来看,您的图表中没有“神经元”,只有张量相互相乘,这种额外的“语义”只是为了让人类更容易谈论这个,但实际上并不是编码在您的图表中。

    您可以通过为图表的各个部分指定 variable_scope自己对节点进行分组,然后在 TB 中显示后,它们将显示为单个节点.它不会为您提供这种“类似每个神经元”的可视化风格,但至少它会隐藏许多细节。创建一个漂亮的、视觉上吸引人的神经网络可视化本身就是一门“艺术”,而且通常是一项艰巨的任务。

    【讨论】:

      【解决方案2】:

      这是我们在 PipelineAI 笔记本中使用的一段代码,用于在 Jupyter 笔记本中内联显示 TensorFlow 图:

      from __future__ import absolute_import
      from __future__ import division
      from __future__ import print_function
      import re
      from google.protobuf import text_format
      from tensorflow.core.framework import graph_pb2
      
      def convert_graph_to_dot(input_graph, output_dot, is_input_graph_binary):
          graph = graph_pb2.GraphDef()
          with open(input_graph, "rb") as fh:
              if is_input_graph_binary:
                  graph.ParseFromString(fh.read())
              else:
                  text_format.Merge(fh.read(), graph)
          with open(output_dot, "wt") as fh:
              print("digraph graphname {", file=fh)
              for node in graph.node:
                  output_name = node.name
                  print("  \"" + output_name + "\" [label=\"" + node.op + "\"];", file=fh)
                  for input_full_name in node.input:
                      parts = input_full_name.split(":")
                      input_name = re.sub(r"^\^", "", parts[0])
                      print("  \"" + input_name + "\" -> \"" + output_name + "\";", file=fh)
              print("}", file=fh)
              print("Created dot file '%s' for graph '%s'." % (output_dot, input_graph))
      
      input_graph='/root/models/optimize_me/linear/cpu/unoptimized_cpu.pb'
      output_dot='/root/notebooks/unoptimized_cpu.dot'
      convert_graph_to_dot(input_graph=input_graph, output_dot=output_dot, is_input_graph_binary=True)
      

      使用 graphviz,您可以在笔记本单元格中使用 %%bash 魔法将 .dot 转换为 .png:

      %%bash
      
      dot -T png /root/notebooks/unoptimized_cpu.dot \
          -o /root/notebooks/unoptimized_cpu.png > /tmp/a.out
      

      最后,在笔记本中显示图表:

      from IPython.display import Image
      
      Image('/root/notebooks/unoptimized_cpu.png', width=1024, height=768)
      

      这是一个在 TensorFlow 中实现的简单线性回归模型的示例:

      这是用于在生产中部署和服务 TensorFlow 模型的优化版本(也使用上述代码 sn-ps 渲染):

      更多此类优化的示例和详细信息,请访问http://pipeline.ai

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-18
        • 2015-12-20
        • 1970-01-01
        • 2011-07-15
        • 2021-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多