2016-05-09 3 views
1

Hey tensorflow Community,Schaffung einer Variable innerhalb tf.variable_scope (name), von einer anderen Variablen des initialized_value initialisiert

ich unerwartete Namenskonventionen erlebe, wenn variable_scope in der folgenden Setup mit:

with tf.variable_scope("my_scope"): 
    var = tf.Variable(initial_value=other_var.initialized_value()) 

In der oben, es gilt

other_var.name = 'outer_scope/my_scope/other_var_name:0' 

Ich bin daher "Wiederverwendung" den gleichen Umfang an dieser Stelle im Code. Intuitiv sehe ich nicht ein Problem mit diesem, aber passiert folgendes:

var.name = 'outer_scope/my_scope_1/var_name:0' 

So offensichtlich, tf nicht glücklich mit „my_scope“ und muss die „_1“ anzuhängen. Das "outer_scope" bleibt jedoch gleich.

Wenn ich nicht mit "Other_var" initialisieren, tritt dieses Verhalten nicht auf.

Eine Erklärung würde sehr geschätzt werden! Thx

Mat

Antwort

3

Sie könnten tf.get_variable() statt ‚tf.Variable` verwenden möchten.

with tf.variable_scope('var_scope', reuse=False) as var_scope: 
    var = tf.get_variable('var', [1]) 
    var2 = tf.Variable([1], name='var2') 
    print var.name # var_scope/var:0 
    print var2.name # var_scope/var2:0 

with tf.variable_scope('var_scope', reuse=True) as var_scope: 
    var = tf.get_variable('var', [1]) 
    var2 = tf.Variable([1], name='var2') 
    print var.name # var_scope/var:0 
    print var2.name # var_scope_1/var2:0 

Der Grund dahinter ist, ich denke, dass in Ihrem Beispiel, obwohl Sie erfolgreich „erneut eingegeben“ die variable_scope Sie haben, was wirklich Ihre Variablennamen beeinflusst, ist ein weiterer Anwendungsbereich name_scope intead von variable_scope wie Sie genannt Macht vermuten. Aus dem offiziellen Dokument here Sie können sehen, dass:

, wenn wir mit tf.variable_scope tun ("name"), dies eröffnet implizit eine tf.name_scope ("name").

name_scope ist ursprünglich für die Verwaltung von Operationsnamen (wie add, matmul) verwendet, da tf.Variable tatsächlich eine Operation ist und dessen Betrieb Name durch, so der Name des name_scope eher erstellt von Variablen „geerbt“ wird als variable_scope wird als Präfix verwendet.

Aber wenn Sie tf.Variable verwenden möchten, können Sie auch direkt name_scope in with Anweisung:

with tf.name_scope('n_scope') as n_scope: 
    var = tf.Variable([1], name='var') 
    print var.name #n_scope/var_1:0 

with tf.name_scope(n_scope) as n_scope: 
    var = tf.Variable([1], name='var') 
    print var.name #n_scope/var_1:0 

Eine Sache, darauf zu achten ist, dass man den Umfang varible als Argument zuvor aus erbeuteten passieren sollte eine with Anweisung, wenn Sie einen Namen Umfang, anstatt str Bereichsname zu „re-enter“ wollen:

with tf.name_scope('n_scope') as n_scope: 
     var = tf.Variable([1], name='var') 
     print var.name #n_scope/var_1:0 

    with tf.name_scope('n_scope') as n_scope: 
     var = tf.Variable([1], name='var') 
     print var.name #n_scope_1/var_1:0 

Achten Sie auf das Argumentgeben.Dieses Verhalten wird wieder in doc Reihe von name_scope beschrieben:

Der Namen Argument wird wie folgt interpretiert werden:

  1. Eine Zeichenfolge (nicht mit '/' endet) wird neuen einen Bereichsnamen, in dem Name an das Präfix aller Vorgänge im Kontext angefügt wird. Wenn der Name zuvor verwendet wurde, wird er durch , der self.unique_name (name) aufruft, eindeutig gemacht.

  2. Ein Bereich zuvor von einem mit g.name_scope (...) als Umfang erfaßt: Aussage als „absoluten“ namen Umfang behandelt werden, die es ermöglicht, erneut eingeben bestehende Bereiche machen.

  3. Ein Wert von None oder die leere Zeichenfolge setzt den aktuellen Namen Bereich auf den Namenbereich der obersten Ebene (leer) zurück.

+0

Thx, super nützlich! – Mathew

Verwandte Themen