tipos declarar como python tensorflow neural-network deep-learning variable-assignment

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)