Pregunta ¿Por qué necesitamos TensorFlow tf.Graph?


Cual es el proposito de:

with tf.Graph().as_default()

Tengo un código de tensorflow que usa lo anterior. Sin embargo, el código tiene solo un gráfico, entonces, ¿por qué lo necesitamos?


32
2017-09-21 11:11


origen


Respuestas:


TL; DR: No es necesario, pero es una buena práctica seguirlo.

Como siempre se registra un gráfico predeterminado, cada op y variable se coloca en el gráfico predeterminado. La declaración, sin embargo, crea un nuevo gráfico y coloca todo (declarado dentro de su alcance) en este gráfico. Si el gráfico es el único gráfico, es inútil. Pero es una buena práctica porque si comienzas a trabajar con muchos gráficos, es más fácil entender dónde se ubican ops y vars. Como esta afirmación no le cuesta nada, es mejor escribirla de todos modos. Solo para estar seguro de que si refactoriza el código en el futuro, las operaciones definidas pertenecen al gráfico que elige inicialmente.


38
2017-09-21 12:25



Es un artefacto de la época en que tenía que especificar explícitamente el gráfico para cada operación que creó.

No he visto ningún caso convincente para necesitar más de un gráfico, por lo que generalmente puede salirse con la suya manteniendo el gráfico implícito y usando tf.reset_default_graph() cuando quieras limpiar la pizarra

Algunos errores

  • La pila de gráficos predeterminada es thread local, por lo que la creación de operaciones en múltiples hilos creará múltiples gráficos
  • Session mantiene un control de su gráfico (sess.graph), así que si creas sesión antes de llamar tf.reset_default_graph(), el gráfico de tu sesión será diferente de tu gráfico predeterminado, lo que significa que las nuevas operaciones que crees no podrán ejecutarse en ese sesson

Cuando golpeas uno de esos errores, puedes establecer un particular graph (es decir, desde tf.get_default_graph() en otro hilo o sess.graph) para que sea el gráfico predeterminado de la siguiente manera:

self.graph_context = graph.as_default()   # save it to some variable that won't get gc'ed
self.graph_context.enforce_nesting = False
self.graph_context.__enter__()

8
2017-09-21 16:20