Python 同时从numpy数组和元组中获取点积
我正在尝试组合数组和元组的不同部分,以生成一系列产品。这是元组“i”:Python 同时从numpy数组和元组中获取点积,python,numpy,linear-algebra,Python,Numpy,Linear Algebra,我正在尝试组合数组和元组的不同部分,以生成一系列产品。这是元组“i”: i=(2,5) 这是第一个矩阵“w”: w=[array([[-1.95446441, 1.53904854, -0.3461807 ], [-0.19153855, -1.63290931, -1.76897156]]), array([[ 0.25648535], [ 0.20186475], [ 0.78002102]])] 这是第二个矩阵“b”
i=(2,5)
这是第一个矩阵“w”:
w=[array([[-1.95446441, 1.53904854, -0.3461807 ],
[-0.19153855, -1.63290931, -1.76897156]]),
array([[ 0.25648535],
[ 0.20186475],
[ 0.78002102]])]
这是第二个矩阵“b”:
[array([[-0.02676943],
[ 0.25294377],
[-0.43625132]]),
array([[ 0.07763943]])]
我试图从这些数据结构的不同部分,在一个名为“a”的列表或矩阵列表中,制作一系列产品
这些产品的清单应等同于:
a[0][0] = (w[0][0][0]*i[0]) + (w[0][1][0]*i[1]) + b[0][0]
a[0][1] = (w[0][0][1]*i[0]) + (w[0][1][1]*i[1]) + b[0][1]
a[0][2] = (w[0][0][2]*i[0]) + (w[0][1][2]*i[1]) + b[0][2]
a[1][0] = (w[1][0] * a[0][0]) + (w[1][1] * a[0][1]) + (w[1][2] * a[0][2]) + b[1][0]
我正试图将其作为神经网络的一部分,并且已经编写了一个版本,该版本使用迭代非常有效。然而,我是numpy新手,我想建立一个基于矩阵的版本。我遇到的问题更多的是理解numpy语法来执行上面的操作。我试着从一个在线教程中修改这个,但不确定从这里可以走到哪里
for b, w in zip(b, w):
layer = sigmoid(np.dot(w, layer)+b.T)
a.append(layer)
这会引发以下错误:
ValueError: shapes (2,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
任何指针都会很有帮助吗?首先,让我们拆分两个变量,
w
和b
。它们不是真正的数组,而是具有不同形状的数组列表
w0 = array([[-1.95446441, 1.53904854, -0.3461807 ],
[-0.19153855, -1.63290931, -1.76897156]])
w1 = array([[ 0.25648535],
[ 0.20186475],
[ 0.78002102]])
b0 = array([[-0.02676943],
[ 0.25294377],
[-0.43625132]])
b1 = array([[ 0.07763943]])
也许以后您可以将它们作为两个元素列表进行迭代,但现在这只会使事情变得复杂
现在,您的a
计算简化为:
a0[0] = w0[0,0]*i[0] + w0[1,0]*i[1] + b0[0]
a0[1] = w0[0,1]*i[0] + w0[1,1]*i[1] + b0[1]
a0[2] = w0[0,2]*i[0] + w0[1,2]*i[1] + b0[2]
a1[0] = w1[0]* a0[0] + w1[1]*a0[1] + w1[2]*a0[2] + b1[0]
a0 = w0[0,:]*i[0] + w0[1,:]*i[1] + b0
a1 = np.sum(w1*a0) + b1
这进一步简化为:
a0[0] = w0[0,0]*i[0] + w0[1,0]*i[1] + b0[0]
a0[1] = w0[0,1]*i[0] + w0[1,1]*i[1] + b0[1]
a0[2] = w0[0,2]*i[0] + w0[1,2]*i[1] + b0[2]
a1[0] = w1[0]* a0[0] + w1[1]*a0[1] + w1[2]*a0[2] + b1[0]
a0 = w0[0,:]*i[0] + w0[1,:]*i[1] + b0
a1 = np.sum(w1*a0) + b1
或
这些总和可以变成点;我认为这是可行的:
a0 = np.dot(w0.T,i) + b0
但我怀疑这是否是一个很大的进步
您不能同时计算a0
和a1
,因为其中一个使用另一个。但您可以将其转换为迭代,如(未测试):
错误很明显,矩阵尺寸不匹配。您正在尝试计算2x3矩阵和1x3矩阵的乘积。我想你应该做
np.dot(w,np.tranpose(layer))
谢谢你的评论,是的,我理解为什么会发生错误,但这是语法问题,而不是计算问题。如果你看一下我上面详细介绍的内容,特别是最后一节“a[1][0]=(w[1][0]*a[0][0])+(w[1][1]*a[0][1])+(w[1][2]*a[0][2]+b[1][0]”,这就是我试图实现的目标,但只是不知道如何让numpy以一种广义的形式实现这一点。你所展示的每一步都非常有帮助,这使得查看代码正在做什么变得非常容易。是的,我想‘a’必须分批计算,我想用numpy来计算每一批,你肯定提高了我对它的理解。非常感谢。