同时从numpy数组和元组中获取点积

时间:2016-03-04 21:03:33

标签: python numpy linear-algebra

我正在尝试将数组和元组的不同部分组合在一起以生成一系列产品。这是元组'我':

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)

任何指针都会非常有用吗?

1 个答案:

答案 0 :(得分:3)

首先,让我们将您的2个变量wb分开。它们不是真正的数组,它们是具有不同形状的数组列表

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  

但我怀疑它是否有很大改善。

您无法一起计算a0a1,因为一方使用另一方。但是您可以将其转换为类似(未经测试)的迭代:

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]