Was ist der Unterschied zwischen variable_scope
und name_scope
? Die variable scope tutorial spricht über variable_scope
implizit zu öffnen name_scope
. Ich habe auch bemerkt, dass das Erstellen einer Variablen in einem name_scope
automatisch seinen Namen mit dem Namen des Bereichs erweitert. Was ist der Unterschied?Unterschied zwischen Variable_Scope und Name_Scope in TensorFlow
Antwort
Wenn Sie eine Variable mit tf.get_variable
erstellen statt tf.Variable
wird Tensorflow beginnt die Namen des Vars mit dem gleichen Verfahren erstellt zu überprüfen, ob sie kollidieren. Wenn sie dies tun, wird eine Ausnahme ausgelöst. Wenn Sie eine Variable mit tf.get_variable
erstellt haben und versuchen, das Präfix Ihrer Variablennamen mithilfe des Kontextmanagers tf.name_scope
zu ändern, verhindert dies nicht, dass Tensorflow eine Ausnahme auslöst. Nur tf.variable_scope
Context Manager wird in diesem Fall den Namen Ihrer Var effektiv ändern. Oder wenn Sie die Variable wiederverwenden möchten, sollten Sie scope.reuse_variables() aufrufen, bevor Sie die Variable das zweite Mal erstellen.
Zusammengefasst tf.name_scope
nur einen Präfix für all in diesem Rahmen (mit Ausnahme des Vars mit tf.get_variable
erstellt), erstellt Tensor hinzufügen und tf.variable_scope
einen Präfix zu dem mit tf.get_variable
erstellten Variablen hinzufügen.
Können Sie etwas mehr darüber sagen, warum zwei Scoping-Mechanismen benötigt werden? –
Ich weiß es nicht. Vielleicht sollten Sie ein Problem auf GitHub erstellen, das den Unterschied zwischen den beiden Mechanismen besser dokumentiert. – cesarsalgado
Ich kann spekulieren. Ich denke, der Grund, zwei Möglichkeiten zu existieren, um eine Variable (tf.Variable und tf.get_variable) zu erstellen, ist, weil Sie normalerweise keine Variable teilen wollen. Wenn Sie dann teilen möchten, müssen Sie eine Variable mit tf.get_variable erstellen und mit tf.variable_scope den Bereich ändern, um explizit anzugeben, dass Sie gemeinsam nutzbare vars bearbeiten. Wenn es in diesem Fall möglich wäre, tf.name_scope zu verwenden, könnte dies die Lesbarkeit des Codes verringern. – cesarsalgado
Ich hatte Probleme mit dem Verständnis der Unterschied zwischen variable_scope und name_scope (sie fast gleich aussahen), bevor ich ein einfaches Beispiel, alles zu visualisieren versucht, durch die Schaffung von:
import tensorflow as tf
def scoping(fn, scope1, scope2, vals):
with fn(scope1):
a = tf.Variable(vals[0], name='a')
b = tf.get_variable('b', initializer=vals[1])
c = tf.constant(vals[2], name='c')
with fn(scope2):
d = tf.add(a * b, c, name='res')
print '\n '.join([scope1, a.name, b.name, c.name, d.name]), '\n'
return d
d1 = scoping(tf.variable_scope, 'scope_vars', 'res', [1, 2, 3])
d2 = scoping(tf.name_scope, 'scope_name', 'res', [1, 2, 3])
with tf.Session() as sess:
writer = tf.summary.FileWriter('logs', sess.graph)
sess.run(tf.global_variables_initializer())
print sess.run([d1, d2])
writer.close()
Hier erstelle ich eine Funktion, die einige Variablen erstellt und Konstanten und gruppiert sie in Bereichen (abhängig von der Art, die ich zur Verfügung gestellt). In dieser Funktion drucke ich auch die Namen aller Variablen. Danach führe ich das Diagramm aus, um Werte der resultierenden Werte zu erhalten, und speichere Ereignisdateien, um sie im Tensorboard zu untersuchen. Wenn Sie dies ausführen, erhalten Sie die folgenden Schritte aus:
scope_vars
scope_vars/a:0
scope_vars/b:0
scope_vars/c:0
scope_vars/res/res:0
scope_name
scope_name/a:0
b:0
scope_name/c:0
scope_name/res/res:0
Sie die ähnliches Muster zu sehen, wenn Sie offen TB (wie Sie b
sehen außerhalb von scope_name
rechteckig ist):
Diese gibt Ihnen die Antwort:
Jetzt sehen Sie, dass tf.variable_scope()
fügt ein Präfix zu den Namen aller Variablen (egal wie Sie erstelle sie), ops, Konstanten. Auf der anderen Seite ignoriert tf.name_scope()
Variablen, die mit tf.get_variable()
erstellt wurden, weil es voraussetzt, dass Sie wissen, welche Variable und in welchem Bereich Sie verwenden möchten.
Eine gute Dokumentation auf Sharing variables sagen Ihnen, dass
tf.variable_scope()
: Verwalten Namensräume für bistf.get_variable()
weitergegeben Namen.
Die gleiche Dokumentation bietet eine weitere Details, wie funktioniert der Variablenbereich und wann es sinnvoll ist.
Ich würde vorschlagen, dieses sehr nützliche Beispiel zu vereinfachen, indem ich das Argument 'vals' weglasse. –
Ich würde auch vorschlagen, den Namen von 'd' von 'res' zu ändern. Ich gehe davon aus, dass dies nichts mit den "res" zu tun hat, die Sie als Scope2 bestanden haben. –
FYI [Was ist der Unterschied zwischen Namensumfang und einem variablen Bereich in Tensorflow?] (Http://Stackoverflow.com/q/35919020/395857) –
Ich sah :-) Danke für den Austausch. Sollen wir diese Frage als Duplikat der anderen Frage markieren? –
Mögliches Duplikat von [Was ist der Unterschied zwischen Namensumfang und einem Variablenbereich im Tensorflow?] (Https://stackoverflow.com/questions/35919020/whats-the-difference-of-name-scope-and-a-variable- scope-in-tensorflow) –