2017-06-01 3 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)) 

Ich konnte nicht verstehen, wenn global_variables_initializer() tatsächlich erforderlich ist. Im obigen Code, wenn wir die Zeilen 4 & 7 auskommentieren, kann ich den Code ausführen und die Werte sehen. Wenn ich laufe, sehe ich einen Absturz. Meine Frage ist, welche Variablen initialisiert werden. 'x' ist eine Konstante, die keine Initialisierung benötigt, und 'y' ist eine Variable, die nicht initialisiert wird, sondern als arithmetische Operation verwendet wird.Wenn global_variables_initializer() tatsächlich erforderlich ist

Antwort

2

tf.global_variables_initializer ist eine Verknüpfung zum Initialisieren aller globalen Variablen. Es ist nicht erforderlich, und Sie können andere Möglichkeiten zum Initialisieren Ihrer Variablen verwenden, oder im Falle von einfachen Skripten müssen Sie sie manchmal überhaupt nicht initialisieren.

Alles außer Variablen erfordert keine Initialisierung (Konstanten und Platzhalter). Aber jede verwendete Variable (auch wenn es eine Konstante ist) sollte initialisiert werden. Dies wird Ihnen einen Fehler geben, obwohl z nur 0-d Tensor mit nur einer Nummer ist.

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

hervorgehoben ich das Wort verwendet, denn wenn man nur Variablen haben, die nicht ausgeführt werden (oder nicht der Läufe hängt von ihnen), die Sie brauchen, um sie nicht zu initialisieren.


Zum Beispiel dieser Code ohne Probleme ausführen, dennoch hat es zwei Variablen und eine Operation, die von ihnen abhängt. Aber der Lauf erfordert sie nicht.

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

In meinem Code gibt es keine "explizite Initialisierung" wie "z = tf.Variable (4)" für eine Variable. Aber ich habe die Variable y verwendet, die von der arithmetischen Operation ausgegeben wird, und sie wird durch sess.run() ausgewertet. In solchen Fällen muss es "implizit initialisiert" werden und daher brauchen wir die Initialisierung der Variablen? – Vinay

+0

@Vinay was meinst du mit 'keine explizite initialisierung'? Und was ist das, wenn nicht eine Initialisierung? 'tf.Variable (x + 5, name = 'y')' –

+0

Danke, du hast Recht. Ich habe diese Aussage eher als arithmetische Operation denn als Initialisierung gedacht. – Vinay

1

Vom docs (Hervorhebung von mir):

Aufruf tf.Variable() fügt mehrere ops dem Graphen:

  • Eine Variable op, die den Variablenwert hält.
  • Ein Initialisierer auf, der die Variable auf ihren Anfangswert setzt. Dies ist eigentlich ein tf.assign op.
  • Die Ops für den Anfangswert, wie z. B. die Nullen op für die Biasvariable im Beispiel, werden ebenfalls zum Graphen hinzugefügt.

Später

Variableninitialisierungen vor anderen ops in Ihrem Modell ausgeführt werden kann explizit ausgeführt werden müssen. Der einfachste Weg, dies zu tun, besteht darin, ein Op hinzuzufügen, das alle Variableninitialisierer ausführt, und dieses Op auszuführen, bevor das Modell verwendet wird.

Kurz gesagt, global_variables_initializer wird nie benötigt, Variable Initialisierung ist. Wenn Sie in Ihrem Code Variables haben, müssen Sie sie zuerst initialisieren. Der global_variables_initializer-Helfer initialisiert alle Variables, die zuvor deklariert wurden, und ist daher nur eine sehr bequeme Möglichkeit, es zu tun.

1

Es ist nie eine Anforderung, wenn Sie einen erklärt tf.Variable oder tf.placeholder aus Ihrer tensorflow Sitzung Lauf verwenden. Persönlich mache ich es mir zur Gewohnheit, tf.global_variables_initializer() zu laufen. Es wird fast Teil des Plattencode Kessel wenn tensorflow Modelle ausgeführt wird:

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

    # run model etc... 
1

Die tf.global_variables_initializer nur alle Variablen initialisiert, dass tf.global_variables() würde Liste. Dies ist in einer verteilten Umgebung, in der sich der Graph möglicherweise in verschiedenen Computerknoten in einem Cluster befindet, sehr sinnvoll.

In einem solchen Fall, die für tf.global_variables_initializer()tf.variables_initializer(tf.global_variables()) nur ein Alias ​​ist, würde alle Variablen in allen Rechenknoten initialisieren, wobei der Graph angeordnet ist.

Verwandte Themen