Tensorflow AssertionError“渐变列表应该已经汇总了”

问题描述 投票:0回答:1

我有一个函数f,内部使用一些tf.while_loops和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.

有人可以概述这个错误的可能原因吗?我不知道从哪里开始寻找问题......

一些观察:

  1. 请注意,我已将while循环的并行迭代设置为1.这应该意味着由于从多个线程读取和写入而没有错误。
  2. 如果我丢弃while循环,只是让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(...)

显然,输出不正确,但至少计算了梯度。

tensorflow
1个回答
0
投票

我遇到了类似的问题。我注意到的一些模式:

  • 如果在x中使用的tf.gradients以需要在body中进行尺寸广播的方式使用,我得到了这个错误。如果我将其改为不需要广播的那个,tf.gradients返回[None]。我没有对此进行广泛测试,因此这种模式在所有示例中可能都不一致。
  • 这两种情况(返回[None]并提出这个断言错误)可以通过区分tf.identity(y)而不仅仅是y来解决:grads = tf.gradients(tf.identity(y), xs)我完全不知道为什么这有效。
© www.soinside.com 2019 - 2024. All rights reserved.