Quelle est la différence entre la portée du nom et une portée variable dans tensorflow?


2 Answers

Namespaces est un moyen d'organiser les noms pour les variables et les opérateurs de manière hiérarchique (par exemple "scopeA / scopeB / scopeC / op1")

  • tf.name_scope crée un espace de noms pour les opérateurs dans le graphique par défaut.
  • tf.variable_scope crée un espace de noms pour les variables et les opérateurs dans le graphique par défaut.

  • tf.op_scope identique à tf.name_scope , mais pour le graphe dans lequel les variables spécifiées ont été créées.

  • tf.variable_op_scope identique à tf.variable_scope , mais pour le graphique dans lequel les variables spécifiées ont été créées.

Les liens vers les sources ci-dessus aident à désambiguïser ce problème de documentation.

Cet exemple montre que tous les types d'étendues définissent des espaces de noms pour les variables et les opérateurs avec les différences suivantes:

  1. Les étendues définies par tf.variable_op_scope ou tf.variable_scope sont compatibles avec tf.get_variable (elle ignore deux autres étendues)
  2. tf.op_scope et tf.variable_op_scope sélectionnez simplement un graphe d'une liste de variables spécifiées pour créer une portée. Autres que leur comportement égal à tf.name_scope et tf.variable_scope conséquence
  3. tf.variable_scope et variable_op_scope ajoutent un initialiseur spécifié ou par défaut.
Question

Quelles sont les différences entre ces fonctions?

tf.variable_op_scope(values, name, default_name, initializer=None)

Renvoie un gestionnaire de contexte pour définir une opération qui crée des variables. Ce gestionnaire de contexte valide que les valeurs données proviennent du même graphe, s'assure que ce graphe est le graphe par défaut et pousse une portée de nom et une portée variable.

tf.op_scope(values, name, default_name=None)

Renvoie un gestionnaire de contexte à utiliser lors de la définition d'une opération Python. Ce gestionnaire de contexte valide que les valeurs données proviennent du même graphe, s'assure que ce graphe est le graphe par défaut et pousse une portée de nom.

tf.name_scope(name)

Wrapper pour Graph.name_scope() utilisant le graphique par défaut. Voir Graph.name_scope() pour plus de détails.

tf.variable_scope(name_or_scope, reuse=None, initializer=None)

Renvoie un contexte pour la portée variable. La portée variable permet de créer de nouvelles variables et de partager celles déjà créées tout en fournissant des vérifications pour ne pas créer ou partager par accident. Pour plus de détails, reportez-vous à la section étendue de la variable. Nous ne présentons ici que quelques exemples de base.




Comme pour API r0.11, op_scope et variable_op_scope sont tous les deux deprecated . name_scope et variable_scope peuvent être imbriqués:

with tf.name_scope('ns'):
    with tf.variable_scope('vs'): #scope creation
        v1 = tf.get_variable("v1",[1.0])   #v1.name = 'vs/v1:0'
        v2 = tf.Variable([2.0],name = 'v2')  #v2.name= 'ns/vs/v2:0'
        v3 = v1 + v2       #v3.name = 'ns/vs/add:0'



Dans la dernière section de cette page de la documentation tensorflow: Noms des ops dans tf.variable_scope()

[...] quand nous faisons with tf.variable_scope("name") , cela ouvre implicitement un tf.name_scope("name") . Par exemple:

with tf.variable_scope("foo"):
  x = 1.0 + tf.get_variable("v", [1])
assert x.op.name == "foo/add"

Les étendues de noms peuvent être ouvertes en plus d'une portée variable, puis elles affectent uniquement les noms des opérations, mais pas les variables.

with tf.variable_scope("foo"):
    with tf.name_scope("bar"):
        v = tf.get_variable("v", [1])
        x = 1.0 + v
assert v.name == "foo/v:0"
assert x.op.name == "foo/bar/add"

Lorsque vous ouvrez une portée variable à l'aide d'un objet capturé au lieu d'une chaîne, nous ne modifions pas la portée du nom actuel pour les opérations.




Related



Tags

tensorflow tensorflow