Estoy tratando de asignar un nuevo valor a una variable de tensorflow en python.

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

Pero la salida que obtengo es

0
0

Entonces el valor no ha cambiado. ¿Qué me estoy perdiendo?

80
abora 11 dic. 2015 a las 12:51

9 respuestas

La mejor respuesta

En TF1, la declaración x.assign(1) en realidad no asigna el valor 1 a x, sino que crea un tf.Operation que tiene que ejecutar explícitamente para actualizar la variable. * Una llamada a Operation.run() o Session.run() se puede utilizar para ejecutar la operación:

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

(* De hecho, devuelve un tf.Tensor, correspondiente al valor actualizado de la variable, para que sea más fácil encadenar las asignaciones).

Sin embargo, en TF2 x.assign(1) ahora asignará el valor con impaciencia:

x.assign(1)
print(x.numpy())
# ==> 1
120
Ninjakannon 13 dic. 2019 a las 18:33

Así que tuve un caso diferente en el que necesitaba asignar valores antes de ejecutar una sesión, así que esta fue la forma más fácil de hacerlo:

other_variable = tf.get_variable("other_variable", dtype=tf.int32,
  initializer=tf.constant([23, 42]))

Aquí estoy creando una variable, así como asignándole valores al mismo tiempo

0
Prabhant Singh 3 abr. 2019 a las 10:26

Utilice el modo de ejecución ansioso Tensorflow, que es el más reciente.

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
Bless 31 ene. 2019 a las 18:53

Respondí una pregunta similar aquí. Miré en muchos lugares que siempre creaban el mismo problema. Básicamente, no quería asignar un valor a los pesos, sino simplemente cambiar los pesos. La versión corta de la respuesta anterior es:

tf.keras.backend.set_value(tf_var, numpy_weights)

1
user5931 11 jun. 2019 a las 12:48

Aquí está el ejemplo de trabajo completo:

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

Tenga en cuenta que la salida será:

0.0
-0.049999997
-2.499994

Esto significa que al principio la Variable era 0, como se definió, luego, después de solo un paso de gradiente decente, la variable era -0.049999997, y después de 10.000 pasos más estamos alcanzando -2.499994 (según nuestra función de costo).

Nota: Originalmente usaste la sesión interactiva. La sesión interactiva es útil cuando se necesitan ejecutar varias sesiones diferentes en el mismo script. Sin embargo, utilicé la sesión no interactiva por simplicidad.

0
prosti 16 ene. 2019 a las 23:04

Además, debe tenerse en cuenta que si está utilizando your_tensor.assign(), entonces no es necesario llamar explícitamente a tf.global_variables_initializer ya que la operación de asignación lo hace en segundo plano.

Ejemplo:

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 

Sin embargo, esto no inicializará todas las variables, sino que solo inicializará la variable en la que se ejecutó assign.

3
kmario23 13 nov. 2017 a las 19:47

También puede asignar un nuevo valor a un tf.Variable sin agregar una operación al gráfico: tf.Variable.load(value, session). Esta función también puede ahorrarle agregar marcadores de posición al asignar un valor desde fuera del gráfico y es útil en caso de que se finalice el gráfico.

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.

Actualización: esto se muestra en TF2 ya que la ejecución ansiosa es predeterminada y los gráficos son ya no está expuesto en la API orientada al usuario.

40
Robin Dinse 13 may. 2019 a las 15:04

En primer lugar, puede asignar valores a variables / constantes simplemente introduciendo valores en ellos de la misma manera que lo hace con marcadores de posición. Entonces, esto es perfectamente 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})

En cuanto a su confusión con el operador tf.assign (). En TF no se ejecuta nada antes de ejecutarlo dentro de la sesión. Por lo tanto, siempre debe hacer algo como esto: op_name = tf.some_function_that_create_op(params) y luego, dentro de la sesión, ejecuta sess.run(op_name). Usando asignar como ejemplo, hará algo como esto:

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)
15
Salvador Dali 24 abr. 2017 a las 05:33

Hay un enfoque más fácil:

x = tf.Variable(0)
x = x + 1
print x.eval()
-9
Gordon Erlebacher 14 mar. 2017 a las 12:24