J'expérimente avec quelques modèles simples dans tensorflow, y compris celui qui ressemble beaucoup au premier exemple MNIST pour ML débutants , mais avec une dimension un peu plus grande. Je peux utiliser l'optimiseur de descente de gradient sans aucun problème, obtenant une convergence suffisante. Lorsque j'essaie d'utiliser l'optimiseur ADAM, j'obtiens des erreurs comme celle-ci:
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é change en fonction de l'exécution. Que signifie cette erreur? Et qu'est-ce que cela suggère est faux? Cela semble se produire quel que soit le taux d’apprentissage que j’utilise.
La classe AdamOptimizer crée des variables supplémentaires, appelées "slots", pour conserver les valeurs des accumulateurs "m" et "v".
Si vous êtes curieux, voyez la source ici, elle est assez 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 machines à sous.
Ces variables doivent être initialisées avant de pouvoir former un modèle.
La méthode normale pour initialiser les variables consiste à appeler tf.initialize_all_variables()
, qui ajoute des opérations pour initialiser les variables présentes dans le graphe lorsqu'il est appelé.
(De plus, contrairement à son nom, initialize_all_variables () n'initialise rien, il ne fait qu'ajouter des opérations qui initialiseront les variables lors de leur exécution.)
Ce que vous devez faire, c'est appeler initialize_all_variables () après que vous ayez 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)
FailedPreconditionError: Tenter d'utiliser une valeur non initialisée est l'une des erreurs les plus fréquentes liées à tensorflow. Dans la documentation officielle, FailedPreconditionError
Cette exception est le plus souvent déclenchée lors de l'exécution d'une opération qui lit une variable avant de l'initialiser.
Dans votre cas, l'erreur explique même quelle 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:
tf.global_variables_initializer()
tf.variables_initializer(list_of_vars)
. Notez que vous pouvez utiliser cette fonction pour imiter global_variable_initializer: tf.variable_initializers(tf.global_variables())
var_name.initializer
J'utilise presque toujours la première approche. N'oubliez pas que vous devriez l'insérer dans une session. Donc, vous obtiendrez quelque chose comme ceci:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
Si vous souhaitez en savoir plus sur les variables, lisez cette documentation pour savoir comment report_uninitialized_variables
et vérifier is_variable_initialized
.
Vous devez appeler tf.global_variables_initializer()
sur votre session, par exemple
init = tf.global_variables_initializer()
sess.run(init)
Un exemple complet est disponible dans ce didacticiel exceptionnel https://www.tensorflow.org/get_started/mnist/mechanics } _
lancer init après AdamOptimizer et sans définir init avant ou exécuter init
sess.run (tf.initialize_all_variables ())
ou
sess.run (tf.global_variables_initializer ())