【问题标题】:Matrix Subtraction | ValueError: operands could not be broadcast together with shapes (1,30) (30,455)矩阵减法 | ValueError:操作数无法与形状一起广播 (1,30) (30,455)
【发布时间】:2021-05-22 20:28:47
【问题描述】:

我正在执行在线性代数中看似合法的操作,但在 Numpy Python 中却不是。

给出上下文;我正在手动设置 ANN,执行反向传播。

在这里,我“转置”w(权重)一维数组(通过将其转换为矩阵然后转置)。 以下是我的麻烦代码:

w = w.T
ans = l*dEdW
w = np.subtract(w, ans)
#w = w - l*dEdW
ValueError: operands could not be broadcast together with shapes (1,30) (30,455) 

数学上: 只要没有。第一个矩阵w 的列等于编号。第二个矩阵 yield of l*dEdW 中的行,然后 A-ok。

就 Numpy 而言,我哪里出错了?

注意:尝试以下行也会产生相同的错误:

w -= l*dEdW  # ideally

更新: print(dEdW) 显示NaNs 的矩阵。我怀疑这是问题所在,因为形状正确但没有内容。

我似乎只能“接受”一个答案。所有的 cmets 和答案都很有见地。我相信这是一个单独的问题。谢谢大家

【问题讨论】:

  • 您应该提供一个最小的可重现示例。这里wdEdWl 是未定义的。例如,至少使用np.zeros 将它们设置为零。
  • 这并不是 Stackoverflow 的工作原理。你需要想出一个对整个社区有用的问题来解决,而不仅仅是你。因此,您需要找到一种以简单方式重现它的方法,以便遇到类似问题的每个人都可以通过理想地阅读此线程来解决它。
  • 看起来您正在尝试对矩阵乘法进行某种减法变体,一种将一个矩阵的列与另一个矩阵的行配对。矩阵乘法以这种方式完成sum-of-productsnumpy 有 - dot@APL 和 MATLAB 对此进行了概括。但是对于numpy,元素操作是常态。
  • 如果你给出一个简单的复制粘贴数组的例子会更好,比如np.arange(4).reshape(2,2)。给出 2 个输入数组,加上一个期望的结果,并清楚地展示您期望的计算。
  • 如果这确实是线性代数中的合法操作,您应该能够参考一些来源(例如 wiki 或一些 LA 教程)。

标签: python numpy matrix deep-learning array-broadcasting


【解决方案1】:

像您尝试做的减法没有明确定义。矩阵减法是逐个元素的,如果你想将这两个数组相减,numpy 需要有一种明显的方法将一个维度广播到另一个数组的维度中。以下是有效的,因为 numpy 假设您要在第二维中重复 arr1, 455 次以匹配 arr2。

import numpy as np

arr1 = np.zeros((30, 1))
arr2 = np.zeros((30, 455))

diff = np.subtract(arr1, arr2)

【讨论】:

    【解决方案2】:

    我想知道您是否只想从另一个数组的每个“行”中减去 w

    In [32]: x = np.arange(12).reshape(3,4)
    In [33]: x
    Out[33]: 
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    In [34]: w = np.array([10,11,12])
    

    从 (3,4) 中减去 (3,) 形状会产生错误:

    In [35]: x-w
    Traceback (most recent call last):
      File "<ipython-input-35-c1920b77405b>", line 1, in <module>
        x-w
    ValueError: operands could not be broadcast together with shapes (3,4) (3,) 
    

    但是如果我们将w 改为 (3,1):

    In [36]: w[:,None]
    Out[36]: 
    array([[10],
           [11],
           [12]])
    In [37]: x-w[:,None]
    Out[37]: 
    array([[-10,  -9,  -8,  -7],
           [ -7,  -6,  -5,  -4],
           [ -4,  -3,  -2,  -1]])
    

    numpy 具有强大的broadcasting 机制,允许我们组合具有不同形状的数组 - 使用一些明确定义的规则。

    【讨论】:

      猜你喜欢
      • 2017-09-09
      • 2012-10-31
      • 2013-04-07
      • 2012-08-05
      • 2018-08-18
      • 2020-06-20
      • 2014-08-24
      • 2018-12-26
      • 2018-02-01
      相关资源
      最近更新 更多