tipos - como declarar variables en python
¿Cómo asignar un valor a una variable TensorFlow? (9)
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?
Además, debe tenerse en cuenta que si está utilizando
your_tensor.assign()
, entonces no es necesario
tf.global_variables_initializer
al
tf.global_variables_initializer
explícitamente, 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ó la
assign
.
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.
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
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)
Hay un enfoque más fácil:
x = tf.Variable(0)
x = x + 1
print x.eval()
La instrucción
x.assign(1)
realidad no asigna el valor
1
a
x
, sino que crea una
tf.Operation
que debe
ejecutar
explícitamente para actualizar la variable. * Una llamada a
Operation.run()
o
Session.run()
se puede usar 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 facilitar el encadenamiento de las asignaciones).
Respondí una pregunta similar here . 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)
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 representa en TF2 ya que la ejecución ansiosa es predeterminada y los gráficos ya no están expuestos en la API orientada al usuario .
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)