2016-12-13 16 views
2

Я использую оп «присваивать» для изменения значения переменных вместо «=», но я обнаружил, что градиент, который я получил, совсем другой. Может ли кто-нибудь сказать мне разницу и почему? благодаря! Как изменения W = w1 до OP1 = tf.assign (ш, w1) sess.run (ОР1)(Tensorflow) Устанавливает ли op назначение вычисления градиента?

ответ

1

= и tf.assign различные операции.

= является питон операция, в которой присваивается значение питона переменной питона

tf.assign является операцией Tensorflow, которая присваивает значение переменной исх и возвращает операцию присвойте.

= выполнен в python и не влияет на график вычислений. tf.assign - это узел в вычислительном графе.

Чтобы понять, давайте запустим этот простой сценарий

import tensorflow as tf 

x = tf.Variable(1) 
y = tf.Variable(2) 

x = y 

print(x.name, y.name) 

a = tf.Variable(1) 
b = tf.Variable(2) 

# override a, otherwise a content is 1 
a = a.assign(b) 
print(a.name, b.name) 

init = tf.global_variables_initializer() 
with tf.Session() as sess: 
    sess.run(init) 
    print(sess.run([x, y, a, b])) 

print(x.name, y.name) выходы Variable_1:0 Variable_1:0

потому что = выполняется в питона и вы перезаписать переменную x.

print(a.name, b.name) выходы Assign:0 Variable_3:0, потому что вы определили назначение op в вычислительном графе, теперь a является назначением op.

При запуске определенного графика, вы получите:

[2, 2, 2, 2] 

Но эти значения вычисляются по-разному: один является вычислением в графе, другие нет.

Если вы забыли назначить a к Назначают оп созданных с tf.assign (таким образом, вы измените строку a = a.assign(b) на a.assign(b)), а затем, когда вы оцениваете график, вы получите:

[2, 2, 1, 2] 
+0

Спасибо много для вашего объяснения. Но не могли бы вы рассказать мне, как назначение op будет способствовать вычислению градиента? Я действительно смущен этим. – Andy

+0

На самом деле я хочу изменить значение переменных без изменения вычисления градиента, – Andy

+0

Если он используется правильно, он не меняет вычисления градиента. Tensorflow использует автоматическое дифференцирование для вычисления градиента, поэтому присваивание op просто создает новый узел в вычислительном графе, который содержит назначенную переменную. Если вы вычислите градиент, текущий поток этого узла, он пройдет без каких-либо изменений. Обычно вы видите различия в результатах градиента, если вы путаете assign и = ops, потому что вы запутаетесь с узлами графов. – nessuno

Смежные вопросы