Quelle est la différence de nom de champ d'application et la portée des variables dans tensorflow?
Quelle est la différences entre ces fonctions?
tf.variable_op_scope(values, name, default_name, initializer=None)
Retourne un gestionnaire de contexte pour la définition d'une op qui crée des variables.
Ce gestionnaire de contexte permet de vérifier que les valeurs données sont de la même graphe, s'assure que le graphique est la valeur par défaut graphique, et pousse un nom de champ d'application et la portée des variables.
tf.op_scope(values, name, default_name=None)
Retourne un gestionnaire de contexte pour les utiliser lors de la définition d'un Python op.
Ce gestionnaire de contexte permet de vérifier que les valeurs données sont de la même graphe, s'assure que le graphique est la valeur par défaut graphique, et pousse un nom de champ.
tf.name_scope(name)
Wrapper pour
Graph.name_scope()
l'aide du graphique par défaut.
VoirGraph.name_scope()
pour plus de détails.
tf.variable_scope(name_or_scope, reuse=None, initializer=None)
Retourne un contexte de portée variable.
La portée des variables permet de créer de nouvelles variables et de partager déjà créés tout en fournissant des contrôles afin de ne pas créer ou partager par accident. Pour plus de détails, voir l'Étendue de la Variable Comment, nous présentons ici que quelques exemples de base.
- Double Possible de Quelle est la différence entre variable_scope et name_scope?
Vous devez vous connecter pour publier un commentaire.
Nous allons commencer par une brève introduction à la variable de partage. C'est un mécanisme de
TensorFlow
qui permet le partage de variables accessibles dans différentes parties du code sans passer par des références à la variable autour de.La méthode
tf.get_variable
peuvent être utilisés avec le nom de la variable que l'argument soit de créer une nouvelle variable avec un tel nom ou de récupérer celui qui a été créé avant. C'est différent de l'utilisation de latf.Variable
constructeur qui permettra de créer une nouvelle variable à chaque fois qu'il est appelé (et éventuellement ajouter un suffixe au nom de la variable si une variable avec un tel nom existe déjà).C'est pour le but de la variable mécanisme de partage que d'un type distinct de la portée (portée des variables) a été introduit.
Comme un résultat, nous avons deux types de périmètres:
tf.name_scope
tf.variable_scope
Les deux étendues ont le même effet sur toutes les opérations ainsi que les variables créées à l'aide de
tf.Variable
, c'est à dire, le champ sera ajouté comme préfixe pour le fonctionnement ou le nom de la variable.Toutefois, le nom de champ est ignoré par
tf.get_variable
. On peut le voir dans l'exemple suivant:La seule façon de placer une variable accessible à l'aide de
tf.get_variable
dans un champ d'application est d'utiliser une variable de portée, comme dans l'exemple suivant:Cela nous permet de partager facilement les variables à travers les différentes parties du programme, au sein même nom différent étendues:
Mise à JOUR
De la version r0.11,
op_scope
etvariable_op_scope
sont à la fois obsolète et remplacé parname_scope
etvariable_scope
.scope
méthode qui a effectivement fait unvariable_scope
?"variable_scope
vsname_scope
est même nécessaire. Si l'on crée une variable (en quelque sorte avectf.Variable
outf.get_variable
), il semble plus naturel pour moi que nous devons toujours être en mesure de l'obtenir si l'on précise le champ d'application ou de son nom complet. Je ne comprends pas pourquoi on ignore le nom de l'étendue chose, tandis que l'autre n'a pas. Comprenez-vous les raisons de ce comportement bizarre?Les deux variable_op_scope et op_scope sont désormais obsolète et ne doit pas être utilisé à tous.
Concernant les deux autres, j'ai également eu des problèmes de compréhension de la différence entre variable_scope et name_scope (ils ont regardé presque la même) avant j'ai essayé de visualiser tout en créant un exemple simple:
Ici, j'ai créer une fonction qui crée des variables et des constantes et des groupes dans des étendues (selon le type que je fournis). Dans cette fonction, j'ai aussi l'impression que les noms de toutes les variables. Après, j'exécute le graphique pour obtenir les valeurs de la suite de valeurs et d'enregistrer l'événement-les fichiers de l'examiner dans TensorBoard. Si vous exécutez ce code, vous obtiendrez la suivante:
Vous voyez le schéma semblable si vous ouvrez TensorBoard (comme vous le voyez
b
est à l'extérieur descope_name
rectangulaire):Cela vous donne la réponse:
Maintenant vous voyez que
tf.variable_scope()
ajoute un préfixe aux noms de toutes les variables (peu importe comment vous les créer), des op, des constantes. D'autre parttf.name_scope()
ignore les variables créées avectf.get_variable()
parce qu'il suppose que vous savez quelles sont les variables et dont la portée que tu voulais l'utiliser.Une bonne documentation sur Le partage de variables vous dit que
La même documentation présente plus en détails comment fonctionne la Portée des Variables de travail et lorsque c'est utile.
Espaces de noms est une manière d'organiser des noms de variables et les opérateurs de manière hiérarchique (par exemple, "scopeA/scopeB/scopeC/op1")
tf.name_scope
crée de l'espace de noms pour les opérateurs dans le graphique par défaut.tf.variable_scope
crée de l'espace de noms pour les variables et les opérateurs dans le graphique par défaut.tf.op_scope
même quetf.name_scope
, mais pour le graphique où certaines variables ont été créées.tf.variable_op_scope
même quetf.variable_scope
, mais pour le graphique où certaines variables ont été créées.Des liens vers les sources ci-dessus aident à lever l'ambiguïté de cette documentation problème.
Cet exemple montre que tous les types de champs définissent les espaces de noms pour les variables et les opérateurs avec les différences suivantes:
tf.variable_op_scope
outf.variable_scope
sont compatibles avectf.get_variable
(il ignore les deux autres étendues)tf.op_scope
ettf.variable_op_scope
il suffit de sélectionner un graphique à partir de la liste des variables pour créer un champ pour. Autres que que leur comportement égal àtf.name_scope
ettf.variable_scope
en conséquencetf.variable_scope
etvariable_op_scope
ajouter spécifié ou d'initialisation par défaut.Comme pour l'API r0.11,
op_scope
etvariable_op_scope
sont à la fois obsolète.name_scope
etvariable_scope
peuvent être imbriquées:Vous pouvez penser que les deux groupes:
variable_op_scope
etop_scope
de prendre un ensemble de variables comme variables d'entrée et sont conçus pour créer des opérations. La différence est dans la façon dont ils affectent la création de variables avectf.get_variable
:notez le nom de la variable
v
dans les deux exemples.même pour
tf.name_scope
ettf.variable_scope
:Vous pouvez lire plus au sujet de la portée des variables dans le tutoriel.
Une question semblable a été demandé avant sur un Débordement de Pile.
Nous allons faire simple: il suffit d'utiliser
tf.variable_scope
. Citant un TF développeur,:Outre le fait que
variable_scope
's de la fonctionnalité s'étend essentiellement ceux dename_scope
, examiner comment ils ne jouent pas tellement bien ensemble:De s'en tenir à
variable_scope
seulement vous éviter quelques maux de tête à cause de ce genre d'incompatibilité.De la dernière section de cette page de l'tensorflow documentation: Les noms des op dans
tf.variable_scope()