我有一个函数f
,内部使用一些tf.while_loop
s和tf.gradients
来计算值y = f(x)
。像这样的东西
def f( x ):
...
def body( g, x ):
# Compute the gradient here
grad = tf.gradients( g, x )[0]
...
return ...
return tf.while_loop( cond, body, parallel_iterations=1 )
有几百行代码。但我相信那些是重点......
现在当我评估f(x)
时,我得到了我期望的价值。
y = known output of f(x)
with tf.Session() as sess:
fx = f(x)
print("Error = ", y - sess.run(fx, feed_dict)) # Prints 0
然而,当我尝试评估f(x)
相对于x
的梯度时,即
grads = tf.gradients( fx, x )[0]
我收到了错误
AssertionError: gradients list should have been aggregated by now.
这是完整的痕迹:
File "C:/Dropbox/bob/tester.py", line 174, in <module>
grads = tf.gradients(y, x)[0]
File "C:\Anaconda36\lib\site-packages\tensorflow\python\ops\gradients_impl.py", line 649, in gradients
return [_GetGrad(grads, x) for x in xs]
File "C:\Anaconda36\lib\site-packages\tensorflow\python\ops\gradients_impl.py", line 649, in <listcomp>
return [_GetGrad(grads, x) for x in xs]
File "C:\Anaconda36\lib\site-packages\tensorflow\python\ops\gradients_impl.py", line 727, in _GetGrad
"gradients list should have been aggregated by now.")
AssertionError: gradients list should have been aggregated by now.
有人可以概述这个错误的可能原因吗?我不知道从哪里开始寻找问题......
一些观察:
f
返回body()
,那么代码运行:
# The following does not crash, but we removed the while_loop, so the output is incorrect
def f( x ):
...
def body( g, x ):
# Compute the gradient here
grad = tf.gradients( g, x )[0]
...
return ...
return body(...)
显然,输出不正确,但至少计算了梯度。
我遇到了类似的问题。我注意到的一些模式:
x
中使用的tf.gradients
以需要在body
中进行尺寸广播的方式使用,我得到了这个错误。如果我将其改为不需要广播的那个,tf.gradients
返回[None]
。我没有对此进行广泛测试,因此这种模式在所有示例中可能都不一致。[None]
并提出这个断言错误)可以通过区分tf.identity(y)
而不仅仅是y
来解决:grads = tf.gradients(tf.identity(y), xs)
我完全不知道为什么这有效。