Как присвоить значение переменной TensorFlow?
Я пытаюсь присвоить новое значение переменной tensorflow в 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())
но выход я получаю
0
0
таким образом, значение не изменилось. Чего мне не хватает?
5 ответов:
заявление
x.assign(1)фактически не присваивает значение1доx, а создаетtf.Operationчто вы должны явно выполнить для обновления переменной.* Звонок вOperation.run()илиSession.run()можно использовать для выполнения операции:assign_op = x.assign(1) sess.run(assign_op) # or `assign_op.op.run()` print(x.eval()) # ==> 1(* На самом деле, он возвращает
tf.Tensor, что соответствует обновленному значению переменной, чтобы упростить цепочку назначений.)
вы также можете присвоить новое значение к
tf.Variableбез добавления операции к графу:tf.Variable.load(value, session). Эта функция также может сохранить добавление заполнителей при назначении значения из-за пределов графика, и это полезно в случае, если график завершен.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.
прежде всего, вы можете присваивать значения переменным/константам, просто подавая значения в них так же, как вы делаете это с заполнителями. Так что это совершенно законно сделать:
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})относительно вашей путаницы с tf.назначить() оператора. В TF ничего не выполняется перед запуском его внутри сеанса. Так что вы всегда должны делать что-то вроде этого:
op_name = tf.some_function_that_create_op(params)а затем внутри сеанса вы запускаетеsess.run(op_name). Используя assign в качестве примера, вы что-то сделаете вот так: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)
также, следует отметить, что если вы используете
your_tensor.assign(), потомtf.global_variables_initializerне нужно вызывать явно, так как операция назначения делает это за вас в фоновом режиме.пример:
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однако это не инициализирует все переменные, а только инициализирует переменную, на которой
assignбыл казнен.
Comments