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
将对该列表上的渐变进行求和,返回{{ 1}}对于你的第二个参数中的每个sum_over_ys(dy/dx)
。所以我希望:
x
的行为方式与:
相同tf.gradients([a, b, c], [a, b])
我读错了文档吗?当我测试此代码时,我得到第二个表达式的预期结果tf.gradients(a + b + c, [a, b])
(明确求和[2, 3]
),但第一个得到a + b + c
。 [2, 1]
来自哪里?
答案 0 :(得分:1)
这是因为你使用的是tf.constant
,理论上它不应受输入的影响。
如果您将实验替换为其他任何内容(例如Variables
),它将按预期工作。
当你将一个运算符应用于常量(无论是加法,还是偶数)时,你得到一个不是constant
的新张量,即使它们只在constant
上展开 - 并且因此,您获得了预期的行为。