Tensorflow: L'utilisation D'Adam optimizer

j'expérimente quelques modèles simples dans tensorflow, dont un qui ressemble beaucoup au premier MNIST Pour ml débutants exemple , mais avec une dimensionnalité un peu plus grande. Je suis capable d'utiliser le gradient descent optimizer sans problème, obtenir assez de convergence. Quand J'essaie D'utiliser L'optimizer ADAM, j'obtiens des erreurs comme ceci:

tensorflow.python.framework.errors.FailedPreconditionError: Attempting to use uninitialized value Variable_21/Adam
     [[Node: Adam_2/update_Variable_21/ApplyAdam = ApplyAdam[T=DT_FLOAT, use_locking=false, _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_21, Variable_21/Adam, Variable_21/Adam_1, beta1_power_2, beta2_power_2, Adam_2/learning_rate, Adam_2/beta1, Adam_2/beta2, Adam_2/epsilon, gradients_11/add_10_grad/tuple/control_dependency_1)]]

où la variable spécifique qui se plaint d'être non initialisée des changements en fonction de la course. Que signifie cette erreur signifie? Et que faut-il suggérer, c'est mal? Il semble se produire quel que soit le taux d'apprentissage que j'utilise.

41
demandé sur pythonic metaphor 2015-11-18 22:45:42

5 réponses

la classe AdamOptimizer crée des variables supplémentaires, appelées" slots", pour contenir les valeurs des accumulateurs" m "et" v".

voir la source ici si vous êtes curieux, il est en fait tout à fait lisible: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/adam.py#L39 . D'autres optimiseurs, tels que Momentum et Adagrad utilisent également des slots.

ces variables doivent être initialisées avant que vous puissiez former un modèle.

la façon normale d'initialiser les variables est d'appeler tf.initialize_all_variables() qui ajoute ops pour initialiser les variables présentes dans le graphique quand il est appelé .

(mis à part: contrairement à son nom l'indique, initialize_all_variables () n'initialise rien, il ajoute seulement ops qui initialisera les variables lors de l'exécution.)

ce que vous devez faire est d'appeler initialize_all_variables () après vous avez ajouté l'optimiseur:

...build your model...
# Add the optimizer
train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)
75
répondu Touts 2015-11-21 17:53:30

FailedPreconditionError: tentative d'utiliser une valeur non initialisée est l'une des erreurs les plus fréquentes liées à tensorflow. De la documentation officielle, FailedPreconditionError

cette exception est le plus souvent soulevée lors de l'exécution d'une opération qui ça lit un tf.Variable avant qu'elle ait été initialisée.

dans votre cas, l'erreur explique même ce que variable n'a pas été initialisée: Attempting to use uninitialized value Variable_1 . Un des tutoriels de TF explique beaucoup de choses sur les variables, leur création/initialisation/sauvegarde /chargement

fondamentalement pour initialiser la variable vous avez 3 options:

j'utilise presque toujours la première approche. Rappelez-vous que vous devriez le mettre dans une session de course. Vous obtiendrez donc quelque chose comme ceci:

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

si vous êtes curieux de plus amples informations sur les variables, lire cette documentation pour savoir comment faire report_uninitialized_variables et cochez is_variable_initialized .

2
répondu Salvador Dali 2017-05-23 12:02:48

vous devez appeler tf.global_variables_initializer() sur votre session, comme

init = tf.global_variables_initializer()
sess.run(init)

exemple Complet est disponible dans ce tutoriel https://www.tensorflow.org/get_started/mnist/mechanics

1
répondu LYu 2017-11-28 23:23:44

exécuter init après AdamOptimizer,et sans définir init avant ou exécuter init

sess.exécuter(tf.initialize_all_variables ())

ou

sess.exécuter(tf.global_variables_initializer ())

0
répondu booyoungxu 2017-09-18 09:27:46

j'avais un problème similaire. (Aucun problème de formation avec L'optimiseur GradientDescent, mais erreur soulevée lors de l'utilisation à L'Optimiseur Adam, ou tout autre optimiseur avec ses propres variables)

le passage à une séance interactive a résolu ce problème pour moi.

sess = tf.Session()

en

sess = tf.InteractiveSession()
-3
répondu Cameron Fraser 2017-04-27 03:44:56