42

Я пытаюсь назначить новое значение переменной tensorflow в python.Как присвоить значение переменной TensorFlow?

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 

Так что значение не изменилось. Что мне не хватает?

ответ

72

Оператор 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, соответствующее обновленное значение переменной, чтобы сделать его проще в цепи задания.)

+0

Спасибо! assign_op.run() дает ошибку: AttributeError: объект «Тензор» не имеет атрибута «run». Но sess.run (assign_op) работает отлично. – abora

+0

В этом примере представлены данные, хранящиеся в памяти 'Variable'' x, перед тем как операция 'assign'/изменчивый тензор была перезаписана или создан новый тензор, который сохраняет обновленное значение? – dannygoldstein

+3

Текущая реализация 'assign()' перезаписывает существующее значение. – mrry

-4

Существует более простой подход:

x = tf.Variable(0) 
x = x + 1 
print x.eval() 
+2

o.p. изучал использование 'tf.assign', а не дополнение. – vega

6

Прежде всего, вы можете присвоить значения переменных/константы только путем подачи значений в них так же, как вы это делаете с заполнителями. Так что это совершенно законно делать:

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.assign(). В TF ничего не выполняется, прежде чем запускать его внутри сеанса. Поэтому вам всегда нужно сделать что-то вроде этого: op_name = tf.some_function_that_create_op(params), а затем внутри сеанса, который вы запускаете sess.run(op_name). Использование назначить в качестве примера вы будете делать что-то вроде этого:

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

Обратите внимание, что подача значения через 'feed_dict' не присваивает это значение переменной. –

2

Кроме того, следует отметить, что если вы используете 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 был выполнен на.

2

Вы также можете присвоить новое значение 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.