web-dev-qa-db-fra.com

Lorsque global_variables_initializer () est réellement requis

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))

Je n'ai pas pu comprendre quand global_variables_initializer() est réellement requis. Dans le code ci-dessus, si nous décommentons les lignes 4 et 7, je peux exécuter le code et voir les valeurs. Si je cours tel quel, je vois un crash.

Ma question est de savoir quelles variables il initialise. x est une constante qui n'a pas besoin d'initialisation et y est une variable qui n'est pas en cours d'initialisation mais qui est utilisée comme une opération arithmétique.

17
Vinay

tf.global_variables_initializer est un raccourci pour initialiser toutes les variables globales. Ce n'est pas obligatoire, et vous pouvez utiliser d'autres moyens pour initialiser vos variables ou, dans le cas de scripts simples, vous n'avez parfois pas besoin de les initialiser du tout.

Tout sauf les variables ne nécessite pas d'initialisation (constantes et espaces réservés). Mais chaque variable utilisée (même s'il s'agit d'une constante) doit être initialisée. Cela vous donnera une erreur, bien que z ne soit qu'un tenseur 0-d avec un seul nombre.

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

J'ai mis en surbrillance le mot utilisé, car si vous n'avez que des variables qui ne sont pas exécutées (ou qu'aucune des exécutions n'en dépend), vous n'avez pas besoin de les initialiser.


Par exemple, ce code s'exécutera sans aucun problème, néanmoins il a 2 variables et une opération qui en dépend. Mais la course n'en a pas besoin.

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)) 
16
Salvador Dali

De la docs (accent sur le mien):

L'appel de tf.Variable () ajoute plusieurs opérations au graphique:

  • Une variable op qui contient la valeur de la variable.
  • Un op initialiseur qui définit la variable à sa valeur initiale. Il s'agit en fait d'une opération tf.assign.
  • Les ops pour la valeur initiale, tels que les zéros op pour la variable de biais dans l'exemple sont également ajoutés au graphique.

Plus tard,

Les initialiseurs de variables doivent être exécutés explicitement avant que d'autres opérations dans votre modèle puissent être exécutées. La façon la plus simple de le faire est d'ajouter une opération qui exécute tous les initialiseurs de variables et d'exécuter cette opération avant d'utiliser le modèle.

En bref, global_variables_initializer n'est jamais requis, Variable l'initialisation l'est. Chaque fois que vous avez Variables dans votre code, vous devez d'abord les initialiser. Le global_variables_initializer helper initialise tous les Variables qui ont été déclarés précédemment, et n'est donc qu'un moyen très pratique de le faire.

5
P-Gn

Ce n'est jamais une exigence à moins que vous n'utilisiez un tf.Variable Ou tf.placeholder Déclaré depuis votre session tensorflow. Personnellement, je prends toujours l'habitude d'exécuter tf.global_variables_initializer(). Il fait presque partie du code de la plaque de la chaudière lors de l'exécution de modèles tensorflow:

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

    # run model etc...
2
Calvin Alvin

Le tf.global_variables_initializer Initialise juste toutes les variables que tf.global_variables() listerait. Cela a en fait beaucoup de sens dans un environnement distribué où le graphique peut être situé dans différents nœuds de calcul dans un cluster.

Dans un tel cas, tf.global_variables_initializer() qui n'est qu'un alias pour tf.variables_initializer(tf.global_variables()) initialiserait toutes les variables dans tous les nœuds de calcul, où le graphe est placé.

2
kmario23