2017-06-01 2 views
2
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écommons les lignes 4 & 7, je peux exécuter le code et voir les valeurs. Si je cours tel quel, je vois un accident. Ma question est quelles variables il initialise. 'x' est une constante qui n'a pas besoin d'initialisation et 'y' est une variable qui n'est pas initialisée mais qui est utilisée comme opération arithmétique.Lorsque global_variables_initializer() est réellement requis

Répondre

2

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 faciles, vous n'avez parfois pas besoin de les initialiser du tout.

Tout sauf les variables ne nécessitent pas d'initialisation (constantes et espaces réservés). Mais chaque utilisée variable (même s'il s'agit d'une constante) doit être initialisée. Cela vous donnera une erreur, bien que z soit juste 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)) 

Je mis en évidence le mot utilisé, parce que si vous avez juste des variables qui ne sont pas exécutées (ou non des pistes dépend d'eux) 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 ne les nécessite pas.

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

Dans mon code, il n'y a pas d '"initialisation explicite" comme "z = tf.Variable (4)" pour une variable. Mais j'ai utilisé la variable y qui est la sortie de l'opération arithmétique et elle est évaluée par sess.run(). Dans de tels cas, il doit être «implicitement initialisé» et nous avons donc besoin d'une initialisation variable. – Vinay

+0

@Vinay que voulez-vous dire par «aucune initialisation explicite»? Et qu'est-ce que c'est si ce n'est une initialisation? 'tf.Variable (x + 5, name = 'y')' –

+0

Merci, vous avez raison. Je pensais cette déclaration comme une opération arithmétique plutôt que comme une initialisation. – Vinay

1

De l'docs (Souligné par l'auteur):

Appel tf.Variable() ajoute plusieurs opérations au graphique:

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

Plus tard,

initializers variables doivent être exécutées explicitement avant d'autres opérations dans votre modèle peut être exécuté. La façon la plus simple de le faire est d'ajouter un op qui exécute tous les initialiseurs de variables, et exécute cette op avant d'utiliser le modèle.

En résumé, global_variables_initializer n'est jamais requis, l'initialisation Variable est. Chaque fois que vous avez Variables dans votre code, vous devez les initialiser en premier. L'assistant global_variables_initializer initialise tous les Variables précédemment déclarés. Il s'agit donc d'un moyen très pratique de le faire.

1

Il est jamais une exigence sauf si vous utilisez une déclaration tf.Variable ou tf.placeholder à partir de votre course de session tensorflow. Personnellement, je prends toujours l'habitude de courir tf.global_variables_initializer(). Il devient presque partie du code de la plaque de la chaudière lors de l'exécution des modèles tensorflow:

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

    # run model etc... 
1

Le tf.global_variables_initializer initialisera uniquement toutes les variables qui tf.global_variables() dresserait une liste. Cela a effectivement 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 est juste un alias pour tf.variables_initializer(tf.global_variables()) serait initialiser toutes les variables dans tous les noeuds de calcul, où est placé le graphique.