Ich versuche, einer Tensorflow-Variablen in Python einen neuen Wert zuzuweisen.
import tensorflow as tf
import numpy as np
x = tf.Variable(0)
init = tf.initialize_all_variables()
sess = tf.InteractiveSession()
sess.run(init)
print(x.eval())
x.assign(1)
print(x.eval())
Aber die Ausgabe, die ich bekomme, ist
0
0
Der Wert hat sich also nicht geändert. Was vermisse ich?
Die Anweisung x.assign(1)
weist x
nicht wirklich den Wert 1
zu, sondern erstellt ein tf.Operation
, das Sie explizit run ausführen müssen, um die Variable zu aktualisieren. * Aufruf von Operation.run()
oder Session.run()
kann zum Ausführen der Operation verwendet werden:
assign_op = x.assign(1)
sess.run(assign_op) # or `assign_op.op.run()`
print(x.eval())
# ==> 1
(* Tatsächlich gibt es einen tf.Tensor
zurück, der dem aktualisierten Wert der Variablen entspricht, um das Zuordnen von Zuweisungen zu erleichtern.)
Sie können einem tf.Variable
auch einen neuen Wert zuweisen, ohne dem Diagramm eine Operation hinzuzufügen: tf.Variable.load(value, session)
. Mit dieser Funktion können Sie auch das Hinzufügen von Platzhaltern sparen, wenn Sie einen Wert von außerhalb des Diagramms zuweisen. Dies ist hilfreich, wenn das Diagramm abgeschlossen ist.
import tensorflow as tf
x = tf.Variable(0)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(x)) # Prints 0.
x.load(1, sess)
print(sess.run(x)) # Prints 1.
Zunächst können Sie Variablen/Konstanten Werte zuweisen, indem Sie ihnen Werte auf dieselbe Weise wie mit Platzhaltern hinzufügen. Das ist also absolut legal:
import tensorflow as tf
x = tf.Variable(0)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print sess.run(x, feed_dict={x: 3})
Zu Ihrer Verwechslung mit dem Operator tf.assign () . In TF wird nichts ausgeführt, bevor Sie es innerhalb der Sitzung ausführen. Sie müssen also immer etwas wie folgt tun: op_name = tf.some_function_that_create_op(params)
und dann innerhalb der Sitzung, die Sie sess.run(op_name)
ausführen. Wenn Sie "als Beispiel" verwenden, werden Sie Folgendes tun:
import tensorflow as tf
x = tf.Variable(0)
y = tf.assign(x, 1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print sess.run(x)
print sess.run(y)
print sess.run(x)
Es ist auch zu beachten, dass, wenn Sie your_tensor.assign()
verwenden, der tf.global_variables_initializer
nicht explizit aufgerufen werden muss, da der Zuweisungsvorgang dies für Sie im Hintergrund erledigt.
Beispiel:
In [212]: w = tf.Variable(12)
In [213]: w_new = w.assign(34)
In [214]: with tf.Session() as sess:
...: sess.run(w_new)
...: print(w_new.eval())
# output
34
Dadurch werden jedoch nicht alle Variablen initialisiert, sondern nur die Variable, für die assign
ausgeführt wurde.
Ich habe eine ähnliche Frage beantwortet hier . Ich habe an vielen Orten nachgesehen, die immer das gleiche Problem verursachten. Grundsätzlich wollte ich den Gewichten keinen Wert zuweisen, sondern einfach die Gewichte ändern. Die Kurzversion der obigen Antwort lautet:
tf.keras.backend.set_value(tf_var, numpy_weights)
Verwenden Sie den neusten Tensorflow-Ausführungsmodus.
import tensorflow as tf
tf.enable_eager_execution()
my_int_variable = tf.get_variable("my_int_variable", [1, 2, 3])
print(my_int_variable)
Hier ist das vollständige Arbeitsbeispiel:
import numpy as np
import tensorflow as tf
w= tf.Variable(0, dtype=tf.float32) #good practice to set the type of the variable
cost = 10 + 5*w + w*w
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
init = tf.global_variables_initializer()
session = tf.Session()
session.run(init)
print(session.run(w))
session.run(train)
print(session.run(w)) # runs one step of gradient descent
for i in range(10000):
session.run(train)
print(session.run(w))
Beachten Sie die Ausgabe wird:
0.0
-0.049999997
-2.499994
Dies bedeutet, dass die Variable am Anfang 0 war, wie definiert, dann war die Variable nach nur einem Gradientenabstand -0.049999997, und nach 10.000 weiteren Schritten erreichen wir -2.499994 (basierend auf unserer Kostenfunktion).
Hinweis: Sie haben ursprünglich die interaktive Sitzung verwendet. Interaktive Sitzungen sind nützlich, wenn mehrere verschiedene Sitzungen in demselben Skript ausgeführt werden müssen. Ich habe jedoch die nicht interaktive Sitzung zur Vereinfachung verwendet.
Ich hatte also einen anderen Fall, in dem ich vor dem Ausführen einer Sitzung Werte zuweisen musste. Das war also der einfachste Weg, dies zu tun:
other_variable = tf.get_variable("other_variable", dtype=tf.int32,
initializer=tf.constant([23, 42]))
hier erstelle ich eine Variable und weise sie gleichzeitig zu