2016-12-13 29 views
2

我使用op「assign」來改變變量的值而不是「=」,但是我發現我得到的漸變是完全不同的。有誰能告訴我區別,爲什麼?謝謝! 樣變瓦特= W1 OP1 = tf.assign(W,W1)sess.run(OP1)(Tensorflow)是否指定更改梯度計算?

回答

1

=tf.assign是不同的操作。

=操作,在其中一個python值分配給一個Python變量

tf.assign是分配值給變量ref和返回分配操作一個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因爲您在計算圖中定義了一個賦值操作,現在a是一個賦值操作。

當您運行定義圖表,您可以:

[2, 2, 2, 2] 

但是,這些值計算方式不同:一種是在圖形計算,其他的沒有。

如果您忘記分配atf.assign(因此你改變線路a = a.assign(b)a.assign(b))創建的分配運算,那麼當你評估圖,你會得到:

[2, 2, 1, 2] 
+0

謝謝很多你的解釋。但是,請你告訴我,op分配如何有助於梯度計算?我對此很困惑。 – Andy

+0

其實我想改變變量的值而不改變梯度計算, – Andy

+0

如果正確使用它,它不會改變梯度計算。 Tensorflow使用自動微分來計算梯度,因此賦值操作只是在包含指定變量的計算圖中創建一個新節點。如果你計算這個節點的漸變流動,它將通過沒有任何改變。通常你會發現梯度結果的差異,如果你混淆了assign和= ops,因爲你弄亂了圖節點 – nessuno