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
机制,允许我们结合不同形状的数组 - 有几个明确定义的规则。
我正在执行看似在线性代数中合法但在 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
机制,允许我们结合不同形状的数组 - 有几个明确定义的规则。