web-dev-qa-db-fra.com

Comment exécuter plusieurs graphiques dans une session - API Tensorflow

API Tensorflow a fourni quelques modèles pré-formés et nous a permis de les former à n’importe quel jeu de données. 

J'aimerais savoir comment initialiser et utiliser plusieurs graphes dans une session tensorflow. Je veux importer deux modèles formés dans deux graphiques et les utiliser pour la détection d'objets, mais je suis perdu en essayant d'exécuter plusieurs graphiques au cours d'une même session.

Existe-t-il une méthode particulière pour travailler avec plusieurs graphiques en une session?.

Un autre problème est que, même si je crée deux sessions différentes pour deux graphes différents et que je tente de travailler avec elles, le résultat obtenu est similaire dans la seconde session à partir de la première session instanciée. 

6
saikishor

Chaque Session ne peut avoir qu'une seule Graph. Cela étant dit, selon ce que vous essayez spécifiquement de faire, vous avez plusieurs options.

La première option consiste à créer deux sessions distinctes et à charger un graphique dans chaque session, comme expliqué dans la documentation ici . Vous avez mentionné que vous obteniez des résultats similaires de manière inattendue pour chaque session avec cette approche, mais sans plus de détails, il est difficile de déterminer le problème dans votre cas particulier. Je soupçonne que le même graphique a été chargé dans chaque session ou que vous essayez de l'exécuter séparément, la même session est exécutée deux fois, mais sans plus de détails, il est difficile de le savoir.

La deuxième option consiste à charger les deux graphiques en tant que sous-graphiques du graphique de session principal. Vous pouvez créer deux étendues dans le graphique et créer le graphique pour chacun des graphiques que vous souhaitez charger dans cette étendue. Ensuite, vous pouvez simplement les traiter comme des graphiques indépendants car il n’ya pas de liens entre eux. Lorsque vous exécutez des fonctions globales de graphes normales, vous devez spécifier la portée à laquelle ces fonctions s’appliquent. Par exemple, lorsque vous préformez une mise à jour sur l'un des sous-graphes avec son optimiseur, vous devez obtenir uniquement les variables pouvant être entraînées pour la portée de ce sous-graphe en utilisant quelque chose comme ce qui est montré dans cette réponse .

À moins que vous n'ayez explicitement besoin des deux graphiques pour pouvoir interagir de quelque manière dans le graphique TensorFlow, je vous recommanderais la première approche, de sorte que vous n'ayez pas à sauter dans les anneaux supplémentaires dont les sous-graphiques auront besoin (par exemple, le filtrage Portée avec votre travail à un moment donné, et la possibilité de partager graphiquement les choses globales entre les deux).

11
golmschenk

L'argument du graphe dans une session devrait être Aucun (le graphe par défaut ou)

Voici le code source

class BaseSession(SessionInterface):
  """A class for interacting with a TensorFlow computation.
  The BaseSession enables incremental graph building with inline
  execution of Operations and evaluation of Tensors.
  """

  def __init__(self, target='', graph=None, config=None):
    """Constructs a new TensorFlow session.
    Args:
      target: (Optional) The TensorFlow execution engine to connect to.
      graph: (Optional) The graph to be used. If this argument is None,
        the default graph will be used.
      config: (Optional) ConfigProto proto used to configure the session.
    Raises:
      tf.errors.OpError: Or one of its subclasses if an error occurs while
        creating the TensorFlow session.
      TypeError: If one of the arguments has the wrong type.
    """
    if graph is None:
      self._graph = ops.get_default_graph()
    else:
      if not isinstance(graph, ops.Graph):
        raise TypeError('graph must be a tf.Graph, but got %s' % type(graph))

Et vous pouvez voir dans l'extrait ci-dessous qu'il ne peut pas s'agir d'une liste. 

if graph is None:
  self._graph = ops.get_default_graph()
else:
  if not isinstance(graph, ops.Graph):
    raise TypeError('graph must be a tf.Graph, but got %s' % type(graph))

Et à partir de l'objet ops.Graph (rechercher par aide (ops.Graph)), il ne peut pas s'agir de plusieurs graphiques. 

Pour more à propos de la théorie et du graphique: 

If no `graph` argument is specified when constructing the session,
the default graph will be launched in the session. If you are
using more than one graph (created with `tf.Graph()` in the same
process, you will have to use different sessions for each graph,
but each graph can be used in multiple sessions. In this case, it
is often clearer to pass the graph to be launched explicitly to
the session constructor.
0
lerner