2017-07-17 38 views
0

tf.gradients在傳遞張量列表作爲第一個參數時的表現如何?就拿這個非常小的例子:當傳遞`ys`張量列表時,tf.gradients如何表現?

a = tf.constant(5) 
b = tf.constant(7) 
c = a + 2 * b 

如果我計算一個張量,c的梯度,相對於[a,b],我得到預期的答案:

grads = tf.gradients(c, [a, b]) 
with tf.Session() as sess: 
    sess.run(grads) # returns (1, 2) 

按照Tensorflow文檔,如果你傳遞一個張量列表作爲第一個參數ys,tf.gradients將對該列表中的梯度進行求和,並在第二個參數中爲每個x返回sum_over_ys(dy/dx)。所以,我希望:

tf.gradients([a, b, c], [a, b]) 

表現方法一樣:

tf.gradients(a + b + c, [a, b]) 

難道我讀文檔錯了嗎?當我測試此代碼,我得到預期的結果[2, 3]第二表達式(明確地總結a + b + c),但[2, 1]爲先。 [2, 1]從哪裏來?

+0

古怪,它工作正常(如預期)如果我走衍生物相對於'[tf.identity(a)中,tf.identity(B),C]'。這是TF中的一個錯誤,還是因爲某種原因,你不應該在'ys'列表中包含一些'xs'? –

回答

1

這是由於您使用的是tf.constant,這在理論上不應該被投入受到影響。

如果換成別的(如Variables)的實驗中按預期工作。

當你申請一個運營商的常數(無論是增加,甚至身份),您將獲得一個新的張量不是constant,即使他們depand只constant秒 - 因此你獲得預期的行爲。