【发布时间】:2020-10-30 22:47:19
【问题描述】:
我正在使用 Autograd 来计算浮点值函数的梯度。该函数涉及一个数组数组作为参数,并返回一个浮点数,并且相当复杂。产生此错误的最小示例是以下代码中的函数:
import autograd.numpy as np
from autograd import grad
def mod(param):
'''
param: Is an array of the form e.g. [0.1, [0.1,0.2]], where the second term in the list is an
array,
and the first term is a float.
'''
return param[0]+np.sum(np.array(param[1]))
我阅读了 Autograd 文档,似乎我做的事情是正确的,因为我将 'param[1]' 明确地转换为一个数组。运行以下命令时:
dmod = grad(mod)
x = np.array([0.1,np.array([0.1,0.1])])
dmod(x)
我收到错误消息:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-289-5fc18f1d6a09> in <module>
3 x = np.array([0.1,np.array([0.1,0.1])])
4
----> 5 dmod(x)
~\Anaconda3\lib\site-packages\autograd\wrap_util.py in nary_f(*args, **kwargs)
18 else:
19 x = tuple(args[i] for i in argnum)
---> 20 return unary_operator(unary_f, x, *nary_op_args, **nary_op_kwargs)
21 return nary_f
22 return nary_operator
~\Anaconda3\lib\site-packages\autograd\differential_operators.py in grad(fun, x)
27 raise TypeError("Grad only applies to real scalar-output functions. "
28 "Try jacobian, elementwise_grad or holomorphic_grad.")
---> 29 return vjp(vspace(ans).ones())
30
31 @unary_to_nary
~\Anaconda3\lib\site-packages\autograd\core.py in vjp(g)
12 def vjp(g): return vspace(x).zeros()
13 else:
---> 14 def vjp(g): return backward_pass(g, end_node)
15 return vjp, end_value
16
~\Anaconda3\lib\site-packages\autograd\core.py in backward_pass(g, end_node)
21 ingrads = node.vjp(outgrad[0])
22 for parent, ingrad in zip(node.parents, ingrads):
---> 23 outgrads[parent] = add_outgrads(outgrads.get(parent), ingrad)
24 return outgrad[0]
25
~\Anaconda3\lib\site-packages\autograd\core.py in add_outgrads(prev_g_flagged, g)
174 else:
175 if sparse:
--> 176 return sparse_add(vspace(g), None, g), True
177 else:
178 return g, False
~\Anaconda3\lib\site-packages\autograd\tracer.py in f_wrapped(*args, **kwargs)
46 return new_box(ans, trace, node)
47 else:
---> 48 return f_raw(*args, **kwargs)
49 f_wrapped.fun = f_raw
50 f_wrapped._is_autograd_primitive = True
~\Anaconda3\lib\site-packages\autograd\core.py in sparse_add(vs, x_prev, x_new)
184 def sparse_add(vs, x_prev, x_new):
185 x_prev = x_prev if x_prev is not None else vs.zeros()
--> 186 return x_new.mut_add(x_prev)
187
188 class VSpace(object):
~\Anaconda3\lib\site-packages\autograd\numpy\numpy_vjps.py in mut_add(A)
696 idx = onp.array(idx, dtype='int64')
697 def mut_add(A):
--> 698 onp.add.at(A, idx, x)
699 return A
700 return SparseObject(vs, mut_add)
ValueError: array is not broadcastable to correct shape
---------------------------------------------------------------------
我使用的是 IPython notebook,我的 Autograd 版本是 1.3。
非常感谢任何帮助!
【问题讨论】: