Tensorflow: Usando el optimizador de Adam

Estoy experimentando con algunos modelos simples en tensorflow, incluido uno que se parece mucho al primer ejemplo de MNIST for ML Beginners , pero con una dimensionalidad algo mayor. Soy capaz de usar el optimizador de pendiente de gradiente sin problemas, obteniendo una convergencia lo suficientemente buena. Cuando bash usar el optimizador de ADAM, recibo errores como este:

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)]] 

donde la variable específica que se queja de ser cambios no inicializados depende de la ejecución. ¿Qué significa este error? ¿Y qué sugiere que está mal? Parece que ocurre sin importar la velocidad de aprendizaje que use.

La clase AdamOptimizer crea variables adicionales, llamadas “slots”, para mantener los valores de los acumuladores “m” y “v”.

Vea la fuente aquí si tiene curiosidad, en realidad es bastante legible: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/adam.py#L39 . Otros optimizadores, como Momentum y Adagrad también usan slots.

Estas variables deben inicializarse antes de poder entrenar un modelo.

La forma normal de inicializar las variables es llamar a tf.initialize_all_variables() que agrega operaciones para inicializar las variables presentes en el gráfico cuando se llama .

(Aparte: a diferencia de lo que sugiere su nombre, initialize_all_variables () no inicializa nada, solo agrega operaciones que inicializarán las variables cuando se ejecuten).

Lo que debe hacer es llamar a initialize_all_variables () después de haber agregado el optimizador:

 ...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: Intentar usar un valor sin inicializar es uno de los errores más frecuentes relacionados con el tensorflow. De la documentación oficial, FailedPreconditionError

Esta excepción generalmente se produce cuando se ejecuta una operación que lee una variable tf.Variable antes de que se haya inicializado.

En su caso, el error incluso explica qué variable no se inicializó: Attempting to use uninitialized value Variable_1 . Uno de los tutoriales de TF explica mucho sobre las variables, su creación / inicialización / guardar / cargar

Básicamente para inicializar la variable tienes 3 opciones:

  • inicialice todas las variables globales con tf.global_variables_initializer()
  • inicialice las variables que le interesan con tf.variables_initializer(list_of_vars) . Tenga en cuenta que puede usar esta función para imitar global_variable_initializer: tf.variable_initializers(tf.global_variables())
  • inicialice solo una variable con var_name.initializer

Casi siempre uso el primer enfoque. Recuerda que debes ponerlo dentro de una sesión ejecutada. Así obtendrás algo como esto:

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

Si tiene curiosidad por obtener más información acerca de las variables, lea esta documentación para saber cómo informar de las report_uninitialized_variables de report_uninitialized_variables y de la report_uninitialized_variables y verifique que se haya is_variable_initialized .

tf.global_variables_initializer() llamar a tf.global_variables_initializer() en su sesión, como

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

El ejemplo completo está disponible en este gran tutorial https://www.tensorflow.org/get_started/mnist/mechanics

ejecute init después de AdamOptimizer, y sin definir init antes o ejecute init

sess.run (tf.initialize_all_variables ())

o

sess.run (tf.global_variables_initializer ())

Estaba teniendo un problema similar. (No hay problemas para entrenar con el optimizador GradientDescent, pero se produce un error al utilizarlo con Adam Optimizer o cualquier otro optimizador con sus propias variables)

Cambiar a una sesión interactiva resolvió este problema para mí.

 sess = tf.Session() 

dentro

 sess = tf.InteractiveSession()