Cuando global_variables_initializer () es realmente requerido

import tensorflow as tf x = tf.constant(35, name='x') y = tf.Variable(x + 5, name='y') # model = tf.global_variables_initializer() with tf.Session() as session: print("x = ", session.run(x)) # session.run(model) print("y = ", session.run(y)) 

No pude entender cuando realmente se requiere global_variables_initializer() . En el código anterior, si descomentamos las líneas 4 y 7, puedo ejecutar el código y ver los valores. Si corro como está, veo un locking.

Mi pregunta es qué variables está inicializando. x es una constante que no necesita inicialización y y es variable que no se está inicializando pero se usa como una operación aritmética.

tf.global_variables_initializer es un atajo para inicializar todas las variables globales. No es obligatorio, y puede utilizar otras formas de inicializar sus variables o, en caso de que haya scripts sencillos, a veces no necesita inicializarlas en absoluto.

Todo excepto las variables no requiere inicialización (constantes y marcadores de posición). Pero cada variable utilizada (incluso si es una constante) debe inicializarse. Esto le dará un error, aunque z es solo un tensor 0-d con un solo número.

 import tensorflow as tf z = tf.Variable(4) with tf.Session() as session: print(session.run(z)) 

Resalté la palabra utilizada, porque si solo tiene variables que no se ejecutan (o que ninguna de las ejecuciones dependen de ellas) no es necesario inicializarlas.


Por ejemplo, este código se ejecutará sin problemas, sin embargo, tiene 2 variables y una operación que depende de ellas. Pero la carrera no los requiere.

 import tensorflow as tf x = tf.constant(35, name='x') y = tf.Variable(x + 5, name='y') z = tf.Variable(4) a = y + z with tf.Session() as session: print("x = ", session.run(x)) 

De los documentos (énfasis mío):

Al llamar a tf.Variable () se agregan varias operaciones al gráfico:

  • Una variable op que contiene el valor de la variable.
  • Una op de inicialización que establece la variable a su valor inicial. Esto es en realidad un tf.assign op.
  • Las operaciones para el valor inicial, como la operación con ceros para la variable de sesgos en el ejemplo también se agregan al gráfico.

Luego,

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.

En resumen, global_variables_initializer nunca es necesario, la inicialización de Variable es. Siempre que tenga Variables en su código, debe inicializarlas primero. El ayudante global_variables_initializer inicializa todas las Variables que se han declarado previamente y, por lo tanto, es una forma muy conveniente de hacerlo.

Nunca es un requisito a menos que esté utilizando una tf.Variable o un tf.placeholder de lugar tf.placeholder desde su ejecución de sesión de tensorflow. Personalmente, siempre lo convierto en ejecutar tf.global_variables_initializer() . Casi se convierte en parte del código de la placa de la caldera cuando se ejecutan modelos de tensorflow:

 with tf.Session(graph=graph) as sess: sess.run(tf.global_variables_initializer()) # run model etc... 

El tf.global_variables_initializer simplemente inicializa todas las variables que tf.global_variables() . Esto realmente tiene mucho sentido en un entorno distribuido donde el gráfico podría estar ubicado en diferentes nodos de computación en un clúster.

En tal caso, tf.global_variables_initializer() que es solo un alias para tf.variables_initializer(tf.global_variables()) inicializaría todas las variables en todos los nodos de computación, donde se coloca el gráfico.