我正在尝试组合数组和元组的不同部分来生成一系列产品。这是元组“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”:
[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)
任何指示都会非常有帮助吗?
最佳答案
首先,让我们拆分 2 个变量: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]])
也许稍后您可以将它们作为 2 个元素列表进行迭代,但现在这只会让事情变得复杂。
现在您的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
或
I0 = np.array([i]).T
a0 = np.sum(w0*i0, axis=0) + b0
这些总和可以变成点;我认为这有效:
a0 = np.dot(w0.T,i) + b0
但我怀疑这是否有很大的改进。
您无法同时计算 a0
和 a1
,因为其中一个会使用另一个。但您可以将其转换为迭代,例如(未测试):
I0 = ...
w = [w0,w1]
b = [b0,b1]
a = [None,None]
for i in range(...):
a[i] = np.sum(w[i]*I0, axis=0) + b[i]
I0 = a[i]
关于python - 同时从 numpy 数组和元组获取点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35805979/