wake-up-neo.com

Wie kann ich einer TensorFlow-Variablen einen Wert zuweisen?

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?

63
abora

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

103
mrry

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.
28
Robin Dinse

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

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.

3
kmario23

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)

1
user5931

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)
0
Aashish Dahiya

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.

0
prosti

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

0
Prabhant Singh