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 graphique, garantit que ce graphique est le graphique par défaut et envoie une étendue de nom et une étendue de 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 graphique, s'assure que ce graphique est le graphique par défaut et pousse une étendue de nom.
tf.name_scope(name)
Wrapper pour
Graph.name_scope()
utiliser le graphique par défaut. VoirGraph.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 contrôles pour ne pas créer ou partager par accident. Pour plus de détails, reportez-vous au How To Scope variable, ici nous ne présentons que quelques exemples de base.
la source
Réponses:
Commençons par une brève introduction au partage de variables. C'est un mécanisme
TensorFlow
qui permet de partager des variables accessibles dans différentes parties du code sans passer de références à la variable autour.La méthode
tf.get_variable
peut être utilisée avec le nom de la variable comme argument pour créer une nouvelle variable avec ce nom ou récupérer celle qui a été créée auparavant. Ceci est différent de l'utilisation dutf.Variable
constructeur qui créera une nouvelle variable à chaque appel (et ajoutera potentiellement un suffixe au nom de la variable si une variable avec un tel nom existe déjà).C'est aux fins du mécanisme de partage des variables qu'un type distinct de portée (portée variable) a été introduit.
En conséquence, nous finissons par avoir deux types différents de portées:
tf.name_scope
tf.variable_scope
Les deux étendues ont le même effet sur toutes les opérations ainsi que sur les variables créées à l'aide
tf.Variable
, c'est-à-dire que l'étendue sera ajoutée en tant que préfixe à l'opération ou au nom de la variable.Cependant, la portée du nom est ignorée par
tf.get_variable
. Nous pouvons voir cela dans l'exemple suivant:La seule façon de placer une variable accessible à l'aide
tf.get_variable
dans une étendue est d'utiliser une étendue variable, comme dans l'exemple suivant:Cela nous permet de partager facilement des variables entre différentes parties du programme, même dans différentes étendues de noms:
METTRE À JOUR
De la version r0.11,
op_scope
etvariable_op_scope
sont à la fois dépréciée et remplacés parname_scope
etvariable_scope
.la source
scope
méthode qui fait effectivement unvariable_scope
?"variable_scope
vsname_scope
est même nécessaire. Si l'on crée une variable (de quelque façon que cetf.Variable
soit avec outf.get_variable
), il me semble plus naturel que nous devrions toujours pouvoir l'obtenir si nous spécifions la portée ou son nom complet. Je ne comprends pas pourquoi l'un ignore le nom de la portée alors que l'autre ne le fait pas. Comprenez-vous le rationnel de ce comportement étrange?Les deux variable_op_scope et op_scope sont maintenant déconseillés et ne doivent pas être utilisés du tout.
En ce qui concerne les deux autres, j'ai également eu des problèmes pour comprendre la différence entre variable_scope et name_scope (ils avaient presque la même apparence) avant d'essayer de tout visualiser en créant un exemple simple:
Ici, je crée une fonction qui crée des variables et des constantes et les regroupe dans des étendues (selon le type que j'ai fourni). Dans cette fonction, j'imprime également les noms de toutes les variables. Après cela, j'exécute le graphique pour obtenir les valeurs des valeurs résultantes et enregistrer les fichiers d'événements pour les étudier dans TensorBoard. Si vous exécutez ceci, vous obtiendrez les éléments suivants:
Vous voyez le modèle similaire si vous ouvrez TensorBoard (comme vous le voyez
b
est en dehors descope_name
rectangulaire):Cela vous donne la réponse :
Maintenant, vous voyez que cela
tf.variable_scope()
ajoute un préfixe aux noms de toutes les variables (peu importe comment vous les créez), ops, constantes. D'un autre côté,tf.name_scope()
ignore les variables créées avectf.get_variable()
car cela suppose que vous savez quelle variable et dans quelle portée vous souhaitez utiliser.Une bonne documentation sur le partage de variables vous indique que
La même documentation fournit plus de détails sur le fonctionnement de la portée variable et quand elle est utile.
la source
Les espaces de noms sont un moyen d'organiser les noms des variables et des 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
commetf.name_scope
pour le graphique dans lequel les variables spécifiées ont été créées.tf.variable_op_scope
commetf.variable_scope
pour le graphique dans lequel les variables spécifiées ont été créées.Les liens vers les sources ci-dessus permettent de lever l'ambiguïté de 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:
tf.variable_op_scope
outf.variable_scope
compatibles avectf.get_variable
(il ignore deux autres étendues)tf.op_scope
ettf.variable_op_scope
sélectionnez simplement un graphique dans une liste de variables spécifiées pour créer une portée pour. Autre que leur comportement égaltf.name_scope
et entf.variable_scope
conséquencetf.variable_scope
etvariable_op_scope
ajoutez l'initialiseur spécifié ou par défaut.la source
Rendons les choses simples: utilisez simplement
tf.variable_scope
. Citant un développeur de TF, :Outre le fait que
variable_scope
la fonctionnalité étend essentiellement ceux dename_scope
, considérez comment ils ne jouent pas si bien ensemble:En vous en tenant
variable_scope
seulement, vous évitez certains maux de tête dus à ce type d'incompatibilité.la source
Quant à l'API r0.11,
op_scope
etvariable_op_scope
sont tous deux obsolètes .name_scope
etvariable_scope
peuvent être imbriqués:la source
Vous pouvez les considérer comme deux groupes:
variable_op_scope
etop_scope
prendre un ensemble de variables en entrée et sont conçus pour créer des opérations. La différence réside dans la façon dont ils affectent la création de variables avectf.get_variable
:remarquez le nom de la variable
v
dans les deux exemples.idem pour
tf.name_scope
ettf.variable_scope
:Vous pouvez en savoir plus sur la portée variable dans le didacticiel . Une question similaire a été posée auparavant sur Stack Overflow.
la source
De la dernière section de cette page de la documentation tensorflow: Noms des ops dans
tf.variable_scope()
la source
Réponse compatible Tensorflow 2.0 : Les explications
Andrzej Pronobis
etSalvador Dali
les détails des fonctions liées àScope
.Parmi les fonctions de portée décrites ci-dessus, qui sont actives à partir de maintenant (17 février 2020) sont
variable_scope
etname_scope
.Spécifier les appels compatibles 2.0 pour ces fonctions, nous avons discuté ci-dessus, pour le bénéfice de la communauté.
Fonction en 1.x :
tf.variable_scope
tf.name_scope
Fonction respective dans 2.x :
tf.compat.v1.variable_scope
tf.name_scope
(tf.compat.v2.name_scope
si migré de1.x to 2.x
)Pour plus d'informations sur la migration de 1.x vers 2.x, veuillez consulter ce Guide de migration .
la source