Was sind die Unterschiede zwischen diesen Funktionen?
tf.variable_op_scope(values, name, default_name, initializer=None)
Gibt einen Kontextmanager zum Definieren einer Operation zurück, die Variablen erstellt. Dieser Kontextmanager überprüft, ob die angegebenen Werte aus demselben Diagramm stammen, stellt sicher, dass dieses Diagramm das Standarddiagramm ist, und überträgt einen Namensbereich und einen Variablenbereich.
tf.op_scope(values, name, default_name=None)
Gibt einen Kontextmanager zur Verwendung beim Definieren einer Python-Operation zurück. Dieser Kontextmanager überprüft, ob die angegebenen Werte aus demselben Diagramm stammen, stellt sicher, dass dieses Diagramm das Standarddiagramm ist, und legt einen Namensbereich fest.
tf.name_scope(name)
Wrapper zur
Graph.name_scope()
Verwendung des Standarddiagramms. SieheGraph.name_scope()
für weitere Details.
tf.variable_scope(name_or_scope, reuse=None, initializer=None)
Gibt einen Kontext für den variablen Bereich zurück. Der Variablenbereich ermöglicht das Erstellen neuer Variablen und das Freigeben bereits erstellter Variablen, während Überprüfungen bereitgestellt werden, um nicht versehentlich zu erstellen oder freizugeben. Einzelheiten finden Sie in der Anleitung zum variablen Umfang. Hier werden nur einige grundlegende Beispiele vorgestellt.
quelle
Antworten:
Beginnen wir mit einer kurzen Einführung in das Teilen von Variablen. Dies ist ein Mechanismus
TensorFlow
, mit dem Variablen, auf die in verschiedenen Teilen des Codes zugegriffen wird, gemeinsam genutzt werden können, ohne Verweise auf die Variable zu übergeben.Die Methode
tf.get_variable
kann mit dem Namen der Variablen als Argument verwendet werden, um entweder eine neue Variable mit diesem Namen zu erstellen oder die zuvor erstellte Variable abzurufen. Dies unterscheidet sich von der Verwendung destf.Variable
Konstruktors, der bei jedem Aufruf eine neue Variable erstellt (und möglicherweise dem Variablennamen ein Suffix hinzufügt, wenn bereits eine Variable mit einem solchen Namen vorhanden ist).Für den Zweck des Mechanismus zur gemeinsamen Nutzung von Variablen wurde ein separater Bereichstyp (variabler Bereich) eingeführt.
Infolgedessen haben wir zwei verschiedene Arten von Bereichen:
tf.name_scope
tf.variable_scope
Beide Bereiche haben den gleichen Effekt auf alle Operationen sowie auf Variablen, die mit erstellt wurden
tf.Variable
, dh der Bereich wird als Präfix zum Operations- oder Variablennamen hinzugefügt.Der Namensbereich wird jedoch von ignoriert
tf.get_variable
. Wir können das im folgenden Beispiel sehen:Die einzige Möglichkeit, eine Variable, auf die mit zugegriffen wird,
tf.get_variable
in einem Bereich zu platzieren, besteht darin, einen Variablenbereich wie im folgenden Beispiel zu verwenden:Auf diese Weise können wir Variablen problemlos über verschiedene Teile des Programms hinweg teilen, auch innerhalb verschiedener Namensbereiche:
AKTUALISIEREN
Ab Version r0.11,
op_scope
undvariable_op_scope
sind sowohl veraltet und ersetzt durchname_scope
undvariable_scope
.quelle
scope
Methode, die a effektiv ausführtvariable_scope
?"variable_scope
vsname_scope
überhaupt notwendig ist. Wenn man eine Variable erstellt (in irgendeiner Weise mittf.Variable
odertf.get_variable
), erscheint es mir natürlicher, dass wir sie immer erhalten können, wenn wir den Bereich oder ihren vollständigen Namen angeben. Ich verstehe nicht, warum einer den Scope-Namen ignoriert, während der andere dies nicht tut. Verstehst du das Rationale für dieses seltsame Verhalten?Sowohl variable_op_scope als auch op_scope sind jetzt veraltet und sollten überhaupt nicht verwendet werden.
In Bezug auf die beiden anderen hatte ich auch Probleme, den Unterschied zwischen variable_scope und name_scope zu verstehen (sie sahen fast gleich aus), bevor ich versuchte, alles anhand eines einfachen Beispiels zu visualisieren:
Hier erstelle ich eine Funktion, die einige Variablen und Konstanten erstellt und sie in Bereichen gruppiert (abhängig von dem von mir angegebenen Typ). In dieser Funktion drucke ich auch die Namen aller Variablen. Danach führe ich das Diagramm aus, um die Werte der resultierenden Werte abzurufen und Ereignisdateien zu speichern, um sie in TensorBoard zu untersuchen. Wenn Sie dies ausführen, erhalten Sie Folgendes:
Sie sehen das ähnliche Muster, wenn Sie TensorBoard öffnen (wie Sie sehen,
b
außerhalb desscope_name
Rechtecks):Dies gibt Ihnen die Antwort :
Jetzt sehen Sie, dass
tf.variable_scope()
den Namen aller Variablen (unabhängig davon, wie Sie sie erstellen), Operationen und Konstanten ein Präfix hinzugefügt wird.tf.name_scope()
Ignoriert andererseits Variablen, die mit erstellt wurden,tf.get_variable()
da davon ausgegangen wird, dass Sie wissen, welche Variable und in welchem Bereich Sie verwenden möchten.Eine gute Dokumentation zum Freigeben von Variablen zeigt Ihnen dies
In derselben Dokumentation finden Sie weitere Informationen zur Funktionsweise des Variablenbereichs und zu dessen Nützlichkeit.
quelle
Namespaces ist eine Möglichkeit, Namen für Variablen und Operatoren hierarchisch zu organisieren (z. B. "scopeA / scopeB / scopeC / op1").
tf.name_scope
Erstellt einen Namespace für Operatoren im Standarddiagramm.tf.variable_scope
Erstellt einen Namespace für Variablen und Operatoren im Standarddiagramm.tf.op_scope
wietf.name_scope
, jedoch für das Diagramm, in dem bestimmte Variablen erstellt wurden.tf.variable_op_scope
wietf.variable_scope
, jedoch für das Diagramm, in dem bestimmte Variablen erstellt wurden.Links zu den oben genannten Quellen helfen dabei, dieses Dokumentationsproblem zu unterscheiden.
Dieses Beispiel zeigt, dass alle Arten von Bereichen Namespaces für Variablen und Operatoren mit folgenden Unterschieden definieren:
tf.variable_op_scope
odertf.variable_scope
mittf.get_variable
diesen kompatibel sind (zwei andere Bereiche werden ignoriert)tf.op_scope
undtf.variable_op_scope
wählen Sie einfach ein Diagramm aus einer Liste der angegebenen Variablen aus, um einen Bereich für zu erstellen. Anders als ihr Verhalten gleichtf.name_scope
undtf.variable_scope
entsprechendtf.variable_scope
undvariable_op_scope
fügen Sie den angegebenen oder Standardinitialisierer hinzu.quelle
Machen wir es einfach: Verwenden Sie einfach
tf.variable_scope
. Zitieren eines TF-Entwicklers :Neben der Tatsache, dass
variable_scope
die Funktionalität im Wesentlichen die von erweitertname_scope
, sollten Sie bedenken, dass sie nicht so gut zusammenspielen:Wenn
variable_scope
Sie sich nur an diese halten, vermeiden Sie Kopfschmerzen aufgrund dieser Art von Inkompatibilität.quelle
Wie für API r0.11,
op_scope
undvariable_op_scope
beide sind veraltet .name_scope
undvariable_scope
kann verschachtelt werden:quelle
Sie können sie als zwei Gruppen betrachten:
variable_op_scope
undop_scope
eine Reihe von Variablen als Eingabe verwenden, um Operationen zu erstellen. Der Unterschied besteht darin, wie sie sich auf die Erstellung von Variablen auswirken mittf.get_variable
:Beachten Sie den Namen der Variablen
v
in den beiden Beispielen.Gleiches gilt für
tf.name_scope
undtf.variable_scope
:Weitere Informationen zum Variablenbereich finden Sie im Lernprogramm . Eine ähnliche Frage wurde vor gefragt auf Stack - Überlauf.
quelle
Aus dem letzten Abschnitt dieser Seite der Tensorflow-Dokumentation: Namen der Operationen in
tf.variable_scope()
quelle
Tensorflow 2.0-kompatible Antwort : Die Erläuterungen zu
Andrzej Pronobis
und FunktionenSalvador Dali
sind sehr detailliertScope
.Von den oben diskutierten Bereichsfunktionen, die ab sofort (17. Februar 2020) aktiv sind, sind
variable_scope
undname_scope
.Festlegen der 2.0-kompatiblen Aufrufe für diese Funktionen, die wir oben zum Nutzen der Community erörtert haben.
Funktion in 1.x :
tf.variable_scope
tf.name_scope
Entsprechende Funktion in 2.x :
tf.compat.v1.variable_scope
tf.name_scope
(tf.compat.v2.name_scope
wenn migriert von1.x to 2.x
)Weitere Informationen zur Migration von 1.x auf 2.x finden Sie in diesem Migrationshandbuch .
quelle