2017-06-08 2 views
2

J'essaie d'en savoir plus sur les GAN et je travaille sur the example here.Impossible d'accéder à l'espace de noms de l'optimiseur TensorFlow Adam

Le code ci-dessous en utilisant l'optimiseur Adam me donne l'erreur

"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?"

J'utilise TF 1.1.0

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) 

Je pense que l'optimiseur Adam prend les variables dans son propre espace de noms mais pour une raison quelconque, ils ne sont pas initialisés. J'appelle global_variables_initializer plus tard dans le code, comme on peut le voir sur la page github. Je vérifie à travers la documentation, je pense que cela peut être lié à moi avoir à mettre une sorte de reuse_variables() appel là-bas, mais je ne suis pas sûr.

Toute aide très appréciée.

+0

Je ne suis pas sûr que cet exemple soit le meilleur à suivre, étant donné qu'il utilise deux optimiseurs pour le discriminateur. Il pourrait utiliser le d_loss déjà défini pour utiliser un seul optimiseur, évitant potentiellement ce problème tout à fait. – jasekp

+0

De plus, l'activation de la sortie du discriminateur est linéaire, où il devrait s'agir d'un sigmoïde (ou autre chose avec une plage de 0 à 1). Ceci explique pourquoi la classification discriminante est négative aux résultats de 0 temps. – jasekp

+0

@jasekp Alors, que conseilleriez-vous? Avoir un optimiseur pour discriminateur me donne toujours l'erreur. Je voudrais que cela fonctionne et comprenne l'optimiseur d'Adam car je pense que c'est ce que le problème est ici. Je peux toujours vérifier plus d'exemples après? Une idée de comment je peux le faire fonctionner? Merci! –

Répondre

0

Votre erreur ValueError est provoquée par la création de nouvelles variables dans le champ variable_scope.reuse == True.

Les variables sont créées par Adam, lorsque vous appelez la fonction de minimisation d'Adam, pour enregistrer les moments de chaque variable pouvant être entraînée dans votre graphique.

En fait, le code "réutilisation = Faux" NE FONCTIONNE PAS comme prévu. L'état de réutilisation ne peut pas revenir à False pour toujours une fois que vous l'avez défini sur True, et l'état de réutilisation sera hérité par tous ses sous-étendues.

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

Je suppose que vous avez défini la réutilisation True quelque part avant que les codes postaux, ainsi le variable_scope.reuse par défaut == True. Ensuite, vous créez une variable_scope pour Adam, cependant, la nouvelle portée héritera de l'état de réutilisation de la portée par défaut. Ensuite, Adam crée une variable sous la réutilisation d'état == True, ce qui provoque une erreur.

La solution consiste à ajouter une sous-portée sous la portée par défaut du graphique lorsque vous définissez variable_scope.reuse = True, alors la portée par défaut est toujours false et Adam.minimize fonctionnera.