python - learning - Tensorflow: utilizando el optimizador de Adam
tensor flow adam optimizer (5)
Estoy experimentando con algunos modelos simples en tensorflow, incluido uno que se parece mucho al primer ejemplo de MNIST para ML Beginners , pero con una dimensionalidad algo mayor. Puedo usar el optimizador de gradiente de descenso sin problemas, obteniendo una convergencia lo suficientemente buena. Cuando intento usar el optimizador de 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 inicializarse cambia según la ejecución. ¿Qué significa este error? ¿Y qué sugiere que está mal? Parece que ocurre independientemente de la velocidad de aprendizaje que uso.
Estaba teniendo un problema similar. (No hay problemas para entrenar con el optimizador GradientDescent, pero se genera un error cuando se usa 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()
La clase AdamOptimizer crea variables adicionales, llamadas "slots", para contener valores para los acumuladores "m" y "v".
Consulte 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 que pueda formar un modelo.
La forma normal de inicializar variables es llamar a tf.initialize_all_variables()
que agrega ops para inicializar las variables presentes en el gráfico cuando se tf.initialize_all_variables()
.
(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 invocar 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)
Necesita 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
ejecuta init después de AdamOptimizer, y sin definir init antes o ejecutar init
sess.run (tf.initialize_all_variables ())
o
sess.run (tf.global_variables_initializer ())
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 plantea con mayor frecuencia 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 las variables, su creation/initialization/saving/loading
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 acercamiento. Recuerde que debe ponerlo dentro de una sesión de ejecución. Entonces obtendrás algo como esto:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
Si tiene curiosidad acerca de más información acerca de las variables, lea esta documentación para saber cómo report_uninitialized_variables
y verificar is_variable_initialized
.