Ha habido muchos casos ( aquí y aquí ) de usuarios de TensorFlow que han agregado
init_op = tf.global_variables_initializer()
antes de definir cualquier variable u operación y luego obtener un error en la línea de
Attempting to use uninitialized value
Aquí hay una explicación , pero no menciona las llamadas subyacentes tf.global_variables_initializer
. Casi está copiando TF API al por mayor. Esta pregunta se enfoca en el hecho de que todavía hay valores sin inicializar cuando algunos usuarios llaman sess.run(init_op)
. Código de ejemplo y un análisis de lo que tf.global_variables_initializer
sería genial.
La API de TensorFlow tiene una sección muy corta en tf.global_variables_initializer
. Simplemente menciona:
Esto es solo un acceso directo para
variable_initializer(global_variables())
.
Rastreando hasta tf.variables_initializer
, podemos ver que el uso de esta función es como tal:
tf.variables_initializer(var_list, name='init')
Esto significa que estamos pasando tf.global_variables
como var_list
a tf.variables_initializer
. Si no hemos definido ninguna variable antes de llamar a tf.global_variables_initializer
, var_list
está esencialmente vacío. El siguiente código ilustra esto:
import tensorflow as tf with tf.Graph().as_default(): # Nothing is printed for v in tf.global_variables(): print v init_op = tf.global_variables_initializer() a = tf.Variable(0) b = tf.Variable(0) c = tf.Variable(0) # 3 Variables are printed here for v in tf.global_variables(): print v with tf.Session() as sess: sess.run(init_op) print sess.run(a)
Las 3 variables impresas son como tales:
Ejecutar el código anterior tal como está provocaría un error en las líneas de lo que se mencionó anteriormente:
Attempting to use uninitialized value
init_op
la posición de init_op
a after abc
:
a = tf.Variable(0) b = tf.Variable(0) c = tf.Variable(0) init_op = tf.global_variables_initializer()
lo haría funcionar
El documento tiene una sección bastante detallada y útil sobre la inicialización de variables . Aprendes en particular que
Los inicializadores de variables deben ejecutarse explícitamente antes de que se puedan ejecutar otras operaciones en su modelo. La forma más sencilla de hacerlo es agregar una operación que ejecute todos los inicializadores de variables y ejecutar esa operación antes de usar el modelo. (..) Use
tf.global_variables_initializer()
para agregar una op para ejecutar inicializadores de variables.
Básicamente, tf.global_variables_initializer()
todas tus variables y llama
sess.run(my_var.initializer)
tf.global_variables_initializer()
hace esto automáticamente y de una vez. Esta función ahorra tiempo, pero técnicamente no tiene que llamarlo y podría inicializar sus variables por otros medios (el ejemplo más frecuente es restaurar pesos desde un archivo).
¿Cómo tiene conocimiento de todas las variables? De forma predeterminada, cuando se crea una Variable
, se agrega a la colección GLOBAL_VARIABLES de GLOBAL_VARIABLES
. Así que global_variables_initializer
está básicamente iterando a través de las variables de esta colección y llamando a su inicializador.
Sin embargo, Variable
permite elegir colecciones para colocarlas. Si excluyes tu variable de GLOBAL_VARIABLES
, la variable creada no se inicializará por tf_global_variables_initializer()
:
import tensorflow as tf x = tf.Variable(0) my_vars = [] y = tf.Variable(0, collections=my_vars) sess = tf.InteractiveSession() tf.global_variables_initializer().run() # does not initialize y! print(x.eval()) # 0 print(y.eval()) # FailedPreconditionError: Attempting to use uninitialized value Variable_2