Matrix Subtraction | ValueError: operands could not be broadcast together with shapes (1,30) (30,455)

Matrix Subtraction | ValueError: operands could not be broadcast together with shapes (1,30) (30,455)

我正在执行看似在线性代数中合法但在 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的矩阵。我怀疑这是问题所在,因为形状正确但没有内容。

我似乎只能“接受”一个答案。所有的评论和回答都很有见地。我认为这是一个单独的问题。谢谢大家

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

import numpy as np

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

diff = np.subtract(arr1, arr2)

我想知道您是否只想从另一个数组的每个 'row' 中减去 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 机制,允许我们结合不同形状的数组 - 有几个明确定义的规则。