矩阵减法| ValueError:操作数无法与形状(1,30)(30455)一起广播

2024-06-06 13:54:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在线性代数中,我执行的似乎是合法的操作,但不是针对Numpy Python

提供上下文;我正在手动设置ANN,执行反向传播

这里,我“转置”了w(权重)1D数组(通过将其转换为矩阵,然后转置)。 下面是我的故障代码:

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的矩阵。我怀疑这就是问题所在,因为形状是正确的,但没有内容

我似乎只能“接受”一个答案。所有的评论和回答都富有洞察力。我认为这是另一个问题。谢谢大家


Tags: 代码numpynp矩阵数组手动故障权重
2条回答

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

import numpy as np

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

diff = np.subtract(arr1, arr2)

我想知道您是否只想从另一个数组的每一行中减去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机制,允许我们使用两个定义良好的规则组合具有不同形状的数组

相关问题 更多 >