【问题标题】:How to fix " operands broadcasting error"如何修复“操作数广播错误”
【发布时间】:2019-06-21 00:50:48
【问题描述】:

我想找到函数 wrt 变量 T 的梯度。我收到错误操作数广播。为什么我收到此错误以及如何解决? l 取值从 0 到 4。

def grad(l,d1,d2):
      grad_T = 0
      b = 1
      w = np.ones(5,1)
      w.reshape(5,1)
      T = np.random.rand(46,5)
      D = np.random.rand(46,9063)
      if(y[d2]!=y[d1]):
                difVec = D[ : ,d2].astype(float) - D[ :,d1].astype(float)
                dify = 1
                if(y[d2]<y[d1]):
                dify = -1
                grad_T = grad_T + (-1*dify*w[l,0]*difVec)/(1+np.exp(dify( 
                w.transpose() @ T.transpose() @ difVec + b )))
      return(grad_T)

    Error
    <ipython-input-40-56571fb637a5> in grad(d1, d2)
    20                 if(y[d2]<y[d1]):
    21                     dify = -1
    ---> 22                     grad_T = grad_T + 
    (-1*dify*w[l,1]*difVec)/(1+np.exp(dify * ( w.transpose() @ 
    T.transpose() @ difVec + b )))

   ValueError: operands could not be broadcast together with shapes (46,) 
   (5,)

【问题讨论】:

  • 在您进行编辑后,您的代码仍然无法运行。 np.ones 要求您传递维度列表。您无法编译上面的代码。再次参考我的回答。此外,您没有解决 w[l, 1] 的问题,无法进行索引。最后,你的 grad_T 的初始形状是什么?如果是 (5,),那么您的求和将不起作用。因为,你不能将两个不同大小的向量相加。

标签: python-3.x numpy machine-learning array-broadcasting


【解决方案1】:

您好,欢迎来到 SO。

首先,您的代码根本无法运行。以下是使其工作的修复程序。对于操作数广播错误,请继续下面。

w = np.ones(5,1)) # excess right paranthesis here
# numpy.ones([5,1]) it should be a list of dimensions
w.reshape(5,1)


T.reshape(46,5) # unnecessary


D = np.random,rand(46, 9063) # random,rand 
# You meant random.rand I suppose

grad_T = grad_T + b
    (-1*dify*w[l,1]*difVec)/(1+np.exp(dify * ( w.transpose() @ 
    T.transpose() @ difVec + b )))
# This here will not work w is [5,1] you cannot index w[l, 1]
# It is definitely out of bounds. You meant w[l, 0] I suppose.

我让您的代码在 Colab 上运行。并且矩阵乘法的所有维度都是正确的。我摆脱了b,因为我不知道它的大小。 b 可能是您遇到错误的罪魁祸首。如果你去掉b,你的提名人就是形状(46,)和你的分母(1,)。您得到的错误可能是因为b 的形状为 (5,)。由于您的 w 是 [5,1],我想您的偏差 (b) 具有相同的尺寸。所以索引 b 矩阵可以解决你的问题。

【讨论】:

  • 谢谢,我已经按照您的建议进行了更正,但仍然会出现同样的错误。 b = 1 和 l 的值是从 0 到 4。
  • 参考我的评论。您的 grad_T 可能是 (5,) 并且计算出的 Theta 是 (46,) 您不能将这两个向量相加。再次检查你的梯度下降公式。
  • grad_T 初始化为 0。grad_T =0 ,这里只是取 sum = sum + x 之类的求和。
  • 我明白了。您能否将您的工作代码复制粘贴到 Colab 上,并将“可共享链接”添加到您的问题中,以便我们观察代码?
猜你喜欢
  • 2019-09-13
  • 2021-04-14
  • 2021-09-08
  • 2021-09-29
  • 1970-01-01
  • 2019-09-27
  • 2019-11-06
  • 2016-12-26
  • 2019-09-01
相关资源
最近更新 更多