2016-07-04 24 views
34

Oficjalny sposób wizualizacji wykresu TensorFlow odbywa się za pomocą TensorBoard, ale czasami chcę po prostu rzucić okiem na wykres, gdy pracuję w Jupyter.Prosty sposób wizualizacji wykresu TensorFlow w Jupyter?

Czy istnieje szybkie rozwiązanie, najlepiej oparte na narzędziach TensorFlow lub standardowych pakietach SciPy (np. Matplotlib), ale w razie potrzeby oparte na bibliotekach zewnętrznych?

+0

Sieć [DeepDream przepis] (https: // GitHub.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/deepdream/deepdream.ipynb) działa bardzo dobrze, ale TensorBoard używa do narysowania niezrozumiałego wykresu z wewnętrznymi dodatkowymi węzłami TensorFlow dodaje uruchomić swoje operacje. Aby poprawić czytelność, napisałem [artykuł] (https://medium.com/@Pasky/teasing-out-tensorflow-graph-mess-64cf5ece4b00#.scvq1weq2) z pewnymi wytycznymi, aby zdefiniować model, aby uzyskać lepsze obraz tego. – Pasky

Odpowiedz

57

Oto recepta ja skopiowane z jednej Alex Mordvintsev głębokim śnie notebook w pewnym momencie

from IPython.display import clear_output, Image, display, HTML 

def strip_consts(graph_def, max_const_size=32): 
    """Strip large constant values from graph_def.""" 
    strip_def = tf.GraphDef() 
    for n0 in graph_def.node: 
     n = strip_def.node.add() 
     n.MergeFrom(n0) 
     if n.op == 'Const': 
      tensor = n.attr['value'].tensor 
      size = len(tensor.tensor_content) 
      if size > max_const_size: 
       tensor.tensor_content = "<stripped %d bytes>"%size 
    return strip_def 

def show_graph(graph_def, max_const_size=32): 
    """Visualize TensorFlow graph.""" 
    if hasattr(graph_def, 'as_graph_def'): 
     graph_def = graph_def.as_graph_def() 
    strip_def = strip_consts(graph_def, max_const_size=max_const_size) 
    code = """ 
     <script> 
      function load() {{ 
      document.getElementById("{id}").pbtxt = {data}; 
      }} 
     </script> 
     <link rel="import" href="https://tensorboard.appspot.com/tf-graph-basic.build.html" onload=load()> 
     <div style="height:600px"> 
      <tf-graph-basic id="{id}"></tf-graph-basic> 
     </div> 
    """.format(data=repr(str(strip_def)), id='graph'+str(np.random.rand())) 

    iframe = """ 
     <iframe seamless style="width:1200px;height:620px;border:0" srcdoc="{}"></iframe> 
    """.format(code.replace('"', '&quot;')) 
    display(HTML(iframe)) 

Następnie wizualizację aktualny wykres

show_graph(tf.get_default_graph().as_graph_def()) 

Jeśli wykres jest zapisany jako pbtxt, można zrobić

gdef = tf.GraphDef() 
from google.protobuf import text_format 
text_format.Merge(open("tf_persistent.pbtxt").read(), gdef) 
show_graph(gdef) 

Zobaczysz coś takiego

enter image description here

+1

Właśnie tego potrzebowałem, dziękuję bardzo Jarosławowi! :) – MiniQuark

+0

Właśnie znalazłem źródło, o którym wspomniałeś. Być może mógłbyś dodać adres URL do swojej odpowiedzi? https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/deepdream/deepdream.ipynb – MiniQuark

+0

czy istnieje sposób dodawania/usuwania węzłów z głównego wykresu, podobny do funkcjonalności TensorBoard? – abora

2

Napisałem prosty pomocnika, który uruchamia tensorboard z notebookiem jupyter. Wystarczy dodać tę funkcję gdzieś na górze notebooka

def TB(cleanup=False): 
    import webbrowser 
    webbrowser.open('http://127.0.1.1:6006') 

    !tensorboard --logdir="logs" 

    if cleanup: 
     !rm -R logs/ 

a następnie uruchomić go TB() przy każdym wygenerowaniu podsumowania. Zamiast otwierania wykresu w tym samym oknie jupyter, to:

  • rozpoczyna tensorboard
  • otwiera nową kartę z tensorboard
  • nawigować do tej zakładce

Po skończeniu z eksploracja, po prostu kliknij zakładkę i przestań przerywać jądro. Jeśli chcesz czyszczenia katalogiem dziennika, po biegu, wystarczy uruchomić TB(1)

0

A Tensorboard/iframe darmową wersję tej wizualizacji, które wprawdzie zostaje zaśmiecone szybko może

import pydot 
from itertools import chain 
def tf_graph_to_dot(in_graph): 
    dot = pydot.Dot() 
    dot.set('rankdir', 'LR') 
    dot.set('concentrate', True) 
    dot.set_node_defaults(shape='record') 
    all_ops = in_graph.get_operations() 
    all_tens_dict = {k: i for i,k in enumerate(set(chain(*[c_op.outputs for c_op in all_ops])))} 
    for c_node in all_tens_dict.keys(): 
     node = pydot.Node(c_node.name)#, label=label) 
     dot.add_node(node) 
    for c_op in all_ops: 
     for c_output in c_op.outputs: 
      for c_input in c_op.inputs: 
       dot.add_edge(pydot.Edge(c_input.name, c_output.name)) 
    return dot 

, które mogą być następnie przez

from IPython.display import SVG 
# Define model 
tf_graph_to_dot(graph).write_svg('simple_tf.svg') 
SVG('simple_tf.svg') 

renderowanie wykres jako rekordy w statycznym plik SVG Integrated Tensorflow Graph in Dot

4

Napisałem rozszerzenie Jupytera do integracji tensorboard. Może on:

  1. start tensorboard poprzez kliknięcie przycisku w Jupyter
  2. Zarządzanie wiele wystąpień tensorboard.
  3. Bezproblemowa integracja z interfejsem Jupyter.

Github: https://github.com/lspvic/jupyter_tensorboard

+0

Wklej najważniejszą część odpowiedzi tutaj. I użyj linków tylko w celach referencyjnych. – krishan

Powiązane problemy