45 votes

Pourquoi avons-nous besoin de TensorFlow tf.Graph ?

Quel est le but de :

with tf.Graph().as_default()

J'ai un code tensorflow qui utilise ce qui précède. Cependant, le code n'a qu'un seul graphique, alors pourquoi en avons-nous besoin ?

55voto

nessuno Points 12786

TL;DR : C'est inutile, mais c'est une bonne pratique à suivre.

Comme un graphe par défaut est toujours enregistré, chaque opération et chaque variable est placée dans le graphe par défaut. L'instruction, cependant, crée un nouveau graphe et place tout ce qui est déclaré dans sa portée dans ce graphe. Si le graphe est le seul graphe, c'est inutile. Mais c'est une bonne pratique car si vous commencez à travailler avec de nombreux graphes, il est plus facile de comprendre où sont placés les ops et les vars. Puisque cette déclaration ne vous coûte rien, il est préférable de l'écrire quand même. Juste pour être sûr que si vous refactorez le code dans le futur, les opérations définies appartiennent au graphe que vous avez choisi initialement.

11voto

Yaroslav Bulatov Points 7316

C'est un artefact de l'époque où vous deviez explicitement spécifier le graphique pour chaque opération que vous créiez.

Je n'ai pas vu d'arguments convaincants pour avoir besoin de plus d'un graphique, donc vous pouvez généralement vous en sortir en conservant le graphique implicite et en utilisant tf.reset_default_graph() quand vous voulez effacer l'ardoise

Quelques écueils :

  • La pile de graphes par défaut est locale au thread, donc créer des opérations dans plusieurs threads créera plusieurs graphes.
  • La session conserve un handle de son graphe ( sess.graph ), donc si vous créez Session avant d'appeler tf.reset_default_graph() Dans ce cas, le graphe de votre session sera différent du graphe par défaut, ce qui signifie que les nouvelles opérations que vous créez ne pourront pas être exécutées dans cette session.

Lorsque vous rencontrez l'un de ces obstacles, vous pouvez définir un paramètre particulier graph (c'est-à-dire de tf.get_default_graph() dans un autre fil ou sess.graph ) pour être le graphique par défaut comme suit :

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__()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X