¿Qué hace tf.global_variables_initializer () debajo del capó?

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