【问题标题】:"ValueError: array is not broadcastable to correct shape" when using nested arrays in Autograd在 Autograd 中使用嵌套数组时,“ValueError:数组不可广播以纠正形状”
【发布时间】: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。

非常感谢任何帮助!

【问题讨论】:

    标签: python numpy autograd


    【解决方案1】:

    我认为问题在于产生错误的输入是一个 numpy 数组。如果将列表 x = [0.1,[0.1,0.1]] 传递给梯度“dmod”,则输出看起来正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2018-05-09
      • 2020-03-07
      • 2022-12-03
      • 2018-06-30
      • 2018-06-08
      • 2020-01-21
      相关资源
      最近更新 更多