2016-03-04 19 views
1

我正在嘗試將數組和元組的不同部分組合起來以生成一系列產品。這裏是元組 '我':同時從numpy數組和元組中獲取點積

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) 

任何指針將是非常有益的?

+0

錯誤非常明顯,矩陣尺寸不匹配。您正試圖計算2x3矩陣和1x3矩陣的乘積。我想你應該做'np.dot(w,np.tranpose(layer))' –

+0

感謝您的評論,是的,我明白錯誤發生的原因,但它的語法而不是計算。如果你看看我上面詳述的內容,特別是最後一節'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以一種廣義的形式做到這一點。 – user3062260

回答

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] 
+0

這對您展示每一步的方式非常有幫助,它可以非常容易地看到代碼在做什麼。是的,我想'a'將不得不分批計算,我想用numpy來計算每一批你明確提高了我的理解。非常感謝。 – user3062260