42

Ich versuche, eine Tensorflow-Variable in Python einen neuen Wert zuzuweisen.Wie weisen Sie einer TensorFlow-Variablen einen Wert zu?

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 der Ausgang ich erhalte, ist

0 
0 

So ist der Wert nicht verändert hat. Was vermisse ich?

Antwort

72

Die Aussage x.assign(1) nicht wirklich 1-x, den Wert zuweisen, sondern schafft vielmehr eine tf.Operation dass Sie explizit Lauf haben die Variable zu aktualisieren * Ein Anruf bei Operation.run() oder Session.run() kann den Betrieb laufen verwendet werden.:

assign_op = x.assign(1) 
sess.run(assign_op) # or `assign_op.op.run()` 
print(x.eval()) 
# ==> 1 

(* In der Tat, es gibt eine tf.Tensor, dem aktualisierten Wert der variablen entspricht, um es zu Ketten Zuweisungen einfacher.)

+0

Danke! assign_op.run() gibt einen Fehler aus: AttributeError: 'Tensor' Objekt hat kein Attribut 'run'. Aber sess.run (assign_op) läuft einwandfrei. – abora

+0

In diesem Beispiel werden die Daten, die die 'Variable'' x' gespeichert hat, bevor die 'assign' Operation/veränderbarer Tensor ausgeführt wurde, überschrieben oder ein neuer Tensor erstellt, der den aktualisierten Wert speichert? – dannygoldstein

+3

Die aktuelle Implementierung von 'assign()' überschreibt den vorhandenen Wert. – mrry

-4

Es gibt einen einfacheren Ansatz:

x = tf.Variable(0) 
x = x + 1 
print x.eval() 
+2

die o.p. untersuchte die Verwendung von "tf.assign", nicht von Zusatz. – vega

6

Zunächst einmal können Sie Werte für Variablen/Konstanten zuweisen nur durch Werte in ihnen die gleiche Art und Weise füttern Sie es mit Platzhalter tun. Das ist also völlig legal zu tun:

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

In Bezug auf Ihre Verwechslung mit dem tf.assign() Operator. In TF wird nichts ausgeführt, bevor Sie es innerhalb der Sitzung ausführen. Sie müssen also immer so etwas tun: op_name = tf.some_function_that_create_op(params) und dann innerhalb der Sitzung sess.run(op_name) ausführen. Unter Verwendung zuweisen als Beispiel werden Sie so etwas 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) 
+1

Beachten Sie, dass der Wert über 'feed_dict' nicht der Variablen zugewiesen wird. –

2

Auch hat darauf hingewiesen, dass, wenn Sie your_tensor.assign() verwenden, dann muss der tf.global_variables_initializer nicht explizit, da der Betrieb es für Sie tut assign genannt werden im Hintergrund.

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 

Dies wird jedoch alle Variablen nicht initialisiert werden, aber es wird nur die Variable initialisiert werden, auf dem assign wurde ausgeführt auf.

2

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 Platzhalter sparen, wenn Sie einen Wert außerhalb des Diagramms zuweisen. Dies ist nützlich, wenn das Diagramm fertiggestellt 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. 
Verwandte Themen