2017-06-08 5 views
2

Ich versuche, über GANs zu lernen, und ich arbeite durch the example here.Zugriff auf TensorFlow Adam optimizer Namensraum

Der Code unter dem Optimierungsprogramm Adam mit gibt mir den Fehler

"ValueError: Variable d_w1/Adam/ does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?"

I TF 1.1.0

bin mit denken
d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dx, labels=tf.fill([batch_size, 1], 0.9))) 
d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dg, labels=tf.zeros_like(Dg))) 
d_loss = d_loss_real + d_loss_fake 

tvars = tf.trainable_variables() 

d_vars = [var for var in tvars if 'd_' in var.name] 
g_vars = [var for var in tvars if 'g_' in var.name] 



# Train the discriminator 
# Increasing from 0.001 in GitHub version 
with tf.variable_scope(tf.get_variable_scope(), reuse=False) as scope: 

    # Next, we specify our two optimizers. In today’s era of deep learning, Adam seems to be the 
    # best SGD optimizer as it utilizes adaptive learning rates and momentum. 
    # We call Adam's minimize function and also specify the variables that we want it to update. 
    d_trainer_real = tf.train.AdamOptimizer(0.0001).minimize(d_loss_real, var_list=d_vars) 
    d_trainer_fake = tf.train.AdamOptimizer(0.0001).minimize(d_loss_fake, var_list=d_vars) 

ich die Adam-Optimierer die Variablen in seinen eigenen Namensraum nimmt aber aus irgendeinem Grund werden sie nicht initialisiert. Ich rufe global_variables_initializer später im Code auf, wie auf der GitHub-Seite zu sehen ist. Ich überprüfe die Dokumentation, ich denke, es könnte damit zu tun haben, dass ich eine Art von Anruf dort reinlegen muss, aber ich bin mir nicht sicher.

Jede Hilfe sehr geschätzt.

+0

Ich bin nicht sicher, ob dieses Beispiel das beste ist, wenn man bedenkt, dass es zwei Optimierer für den Diskriminator verwendet. Es könnte den bereits definierten d_loss verwenden, um einen einzelnen Optimierer zu verwenden und dieses Problem möglicherweise vollständig zu vermeiden. – jasekp

+0

Auch die Aktivierung des Diskriminatorausgangs ist linear, wobei es sich um ein Sigmoid (oder etwas anderes mit einem Bereich von 0 bis 1) handeln sollte. Dies erklärt, warum die Diskriminatorklassifizierung bei den 0-Stufen-Ergebnissen negativ ist. – jasekp

+0

@jasekp Was würden Sie empfehlen? Einen Optimierer für den Diskriminator zu haben, gibt mir immer noch den Fehler. Ich würde gerne arbeiten und den Adam Optimizer verstehen, da ich denke, dass das das Problem hier ist. Ich kann danach immer noch mehr Beispiele sehen? Irgendeine Idee, wie ich es zum Laufen bringen kann? Vielen Dank! –

Antwort

0

Ihr ValueError wird durch das Erstellen neuer Variablen in der Variable_Scope.reuse == True verursacht.

Variablen werden von Adam erstellt, wenn Sie die Minimieren-Funktion von Adam aufrufen, um Momente jeder trainierbaren Variablen in Ihrem Graphen zu speichern.

Eigentlich funktioniert der Code "reuse = False" NICHT wie erwartet. Der Wiederverwendungsstatus kann nicht wieder in "Falsch" geändert werden, wenn Sie ihn auf "True" festgelegt haben. Der Wiederverwendungsstatus wird von allen Unterbereichen übernommen.

with tf.variable_scope(tf.get_variable_scope(), reuse=False) as scope: 
    assert tf.get_variable_scope().reuse == True 

Ich denke, Sie haben festgelegt Wiederverwendung auf True irgendwo vor den Postleitzahlen, so dass die Standard-variable_scope.reuse == True fest. Dann erstellen Sie einen neuen Variablenbereich für Adam. Der neue Bereich erbt jedoch den Wiederverwendungsstatus des Standardbereichs. Dann erstellt Adam Variable unter Statuswiederverwendung == True, wodurch ein Fehler ausgelöst wird.

Die Lösung besteht darin, einen Unterbereich unter dem Standardbereich des Diagramms hinzuzufügen, wenn Sie variable_scope.reuse = True setzen, dann ist der Standardwert scope.reuse immer noch False und Adam.minimize funktioniert.

Verwandte Themen