web-dev-qa-db-fra.com

Comment assigner une valeur à une variable TensorFlow?

J'essaie d'attribuer une nouvelle valeur à une variable 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())

Mais la sortie que je reçois est

0
0

Donc, la valeur n'a pas changé. Qu'est-ce que je rate?

63
abora

L'instruction x.assign(1) n'affecte pas réellement la valeur 1 à x, mais crée plutôt un tf.Operation qu'il faut explicitement exécuter pour mettre à jour la variable. * Un appel à Operation.run() ou Session.run() peut être utilisé pour exécuter l'opération:

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

(* En fait, il retourne un tf.Tensor, correspondant à la valeur mise à jour de la variable, pour faciliter l'enchaînement des affectations.)

103
mrry

Vous pouvez également affecter une nouvelle valeur à un tf.Variable sans ajouter d'opération au graphique: tf.Variable.load(value, session) . Cette fonction peut également vous éviter d’ajouter des espaces réservés lors de l’affectation d’une valeur extérieure au graphique. Elle est utile si le graphique est finalisé.

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

Tout d’abord, vous pouvez affecter des valeurs à des variables/constantes simplement en les introduisant de la même manière que vous le feriez avec des espaces réservés. C'est donc parfaitement légal de faire:

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 ce qui concerne votre confusion avec l'opérateur tf.assign () . Dans TF, rien n'est exécuté avant de l'exécuter à l'intérieur de la session. Donc, vous devez toujours faire quelque chose comme ceci: op_name = tf.some_function_that_create_op(params) et ensuite à l'intérieur de la session, vous exécutez sess.run(op_name). En utilisant assign comme exemple, vous ferez quelque chose comme ceci:

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

En outre, il convient de noter que si vous utilisez your_tensor.assign(), le tf.global_variables_initializer ne doit pas nécessairement être appelé explicitement car l'opération assign le fait pour vous en arrière-plan.

Exemple:

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 

Cependant, cela n'initialisera pas toutes les variables, mais seulement la variable sur laquelle assign a été exécuté.

3
kmario23

J'ai répondu à une question similaire ici . J'ai regardé dans beaucoup d'endroits qui ont toujours créé le même problème. En gros, je ne voulais pas assigner une valeur aux poids, mais simplement changer les poids. La version courte de la réponse ci-dessus est:

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

1
user5931

Utilisez le mode d'exécution le plus récent de Tensorflow.

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

Voici l'exemple de travail complet:

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

Notez que le résultat sera:

0.0
-0.049999997
-2.499994

Cela signifie au tout début que la variable était 0, telle que définie, puis qu'après une étape de gradient décent, la variable était -0,049999997 et après 10 000 étapes supplémentaires, nous atteignons -2,499994 (sur la base de notre fonction de coût).

Remarque: vous avez initialement utilisé la session interactive. Une session interactive est utile lorsque plusieurs sessions différentes doivent être exécutées dans le même script. Cependant, j'ai utilisé la session non interactive pour plus de simplicité.

0
prosti

Donc, j'avais un cas différent où je devais assigner des valeurs avant d'exécuter une session, c'était donc le moyen le plus simple de le faire:

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

ici, je crée une variable et lui attribue des valeurs en même temps

0
Prabhant Singh