Tensorflow: Usando Adam optimizer


Estoy experimentando con algunos modelos simples en tensorflow, incluido uno que se ve muy similar al primer MNIST para principiantes de ML ejemplo, pero con una dimensionalidad algo mayor. Puedo usar el optimizador de descenso de gradiente sin problemas, obteniendo una convergencia lo suficientemente buena. Cuando intento usar el optimizador ADAM, obtengo 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 no estar inicializada cambia dependiendo de la ejecución. ¿Qué hace esto ¿error medio? ¿Y qué sugiere que está mal? Parece ocurrir independientemente de la tasa de aprendizaje que uso.

Author: pythonic metaphor, 2015-11-18

5 answers

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 ranuras.

Estas variables deben inicializarse antes de poder entrenar un modelo.

La forma normal de inicializar variables es llamar tf.initialize_all_variables() que añade ops 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 ops que inicializarán las variables cuando se ejecute.)

Lo que debes hacer es llamar a initialize_all_variables () después de que hayas añadido 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)
 75
Author: Touts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-21 17:53:30

FailedPreconditionError: Intentar utilizar un valor no inicializado es uno de los errores más frecuentes relacionados con tensorflow. De la documentación oficial, FailedPreconditionError

Esta excepción se genera más comúnmente cuando se ejecuta una operación que lee un 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 variables, su creación/inicialización/guardado / carga

Básicamente para inicializar la variable tienes 3 opciones:

Casi siempre uso el primer enfoque. Recuerda que deberías ponlo dentro de una sesión. Así que 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 sobre variables, lea esta documentación para saber cómo report_uninitialized_variables y verifique is_variable_initialized.

 2
Author: Salvador Dali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48

Necesitas llamar a tf.global_variables_initializer() en tu 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

 1
Author: LYu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-28 23:23:44

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

Sess.run (tf.inicialize_all_variables ())

O

Sess.run (tf.global_variables_initializer ())

 0
Author: booyoungxu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-18 09:27:46

Estaba teniendo un problema similar. (No hay problemas de entrenamiento con GradientDescent optimizer, pero se produjo un error al usar Adam Optimizer, o cualquier otro optimizador con sus propias variables)

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

sess = tf.Session()

Hacia

sess = tf.InteractiveSession()
 -3
Author: Cameron Fraser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-27 03:44:56