Python - задача кода умножения матриц - PullRequest
1 голос
/ 28 мая 2020

У меня есть это упражнение, в котором я могу построить простую нейронную сеть с одним входным слоем и одним скрытым слоем ... Я сделал приведенный ниже код для выполнения простого умножения матриц, но он делает это неправильно, как когда я делаю умножение вручную. Что я делаю не так в своем коде?

          #toes %win  #fans
ih_wgt = ([0.1, 0.2, -0.1],  #hid[0]
           [-0.1, 0.1, 0.9],  #hid[1]
           [0.1, 0.4, 0.1])  #hid[2]

          #hid[0] hid[1] #hid[2]
ho_wgt = ([0.3, 1.1, -0.3], #hurt?
           [0.1, 0.2, 0.0],  #win?
           [0.0, 1.3, 0.1])  #sad?

weights = [ih_wgt, ho_wgt]

def w_sum(a,b):
    assert(len(a) == len(b))
    output = 0
    for i in range(len(a)):
        output += (a[i] * b[i])
    return output

def vect_mat_mul(vec, mat): 
  assert(len(vec) == len(mat)) 
  output = [0, 0, 0]
  for i in range(len(vec)): 
    output[i]= w_sum(vec, mat[i])
    return output

def neural_network(input, weights):
  hid = vect_mat_mul(input, weights[0])
  pred = vect_mat_mul(hid, weights[1])
  return pred


toes = [8.5, 9.5, 9.9, 9.0]
wlrec = [0.65, 0.8, 0.8, 0.9]
nfans = [1.2, 1.3, 0.5, 1.0]

input = [toes[0],wlrec[0],nfans[0]]

pred = neural_network(input, weights)
print(pred)

вывод моего кода:

[0.258, 0, 0]

Способ, которым я пытался решить это вручную выглядит следующим образом: Я умножил входной вектор [8.5, 0.65, 1.2] на входную матрицу весов

ih_wgt = ([0.1, 0.2, -0.1],  #hid[0]
           [-0.1, 0.1, 0.9],  #hid[1]
           [0.1, 0.4, 0.1])  #hid[2]

[0,86, 0,295, 1,23]

выходной вектор затем подается в сеть как входной вектор, который затем умножается на скрытую матрицу весов

ho_wgt = ([0.3, 1.1, -0.3], #hurt?
           [0.1, 0.2, 0.0],  #win?
           [0.0, 1.3, 0.1])  #sad?

правильный выходной прогноз:

[0,2135, 0,145, 0,5065 ]

Мы будем благодарны за вашу помощь!

1 Ответ

1 голос
/ 28 мая 2020

Вы почти у цели! Причина в простом отступе:

def vect_mat_mul(vec, mat): 
  assert(len(vec) == len(mat)) 
  output = [0, 0, 0]
  for i in range(len(vec)): 
    output[i]= w_sum(vec, mat[i])
  return output                      # <-- This one was inside the for loop
...