2016-03-04 2 views
1

Я пытаюсь объединить различные части массивов и кортежей для создания серии продуктов. Вот кортеж 'я':Получение точечных продуктов из массивов numpy и кортежей одновременно

i=(2,5) 

Здесь первая матрица 'ш':

w=[array([[-1.95446441, 1.53904854, -0.3461807 ], 
      [-0.19153855, -1.63290931, -1.76897156]]), 
    array([[ 0.25648535], 
      [ 0.20186475], 
      [ 0.78002102]])] 

вот вторая матрица 'Ъ':

[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

Для начала разделим две переменные, 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] 
+0

Это действительно полезно, как вы показали каждый шаг, поэтому очень легко увидеть, что делает код. Да, я подумал, что «a» нужно было бы рассчитать партиями, я хотел использовать numpy для расчета каждой партии, которую вы определенно улучшили. Большое спасибо. – user3062260

Смежные вопросы