Ошибка: ValueError: operands could not be broadcast together with shapes (3,) (2,)

Ошибка:

w1[0, :]=w1[0, :]-np.array(x[0:3])*delta3[0]*lmd
ValueError: operands could not be broadcast together with shapes (3,) (2,)

Что не так?

#стартовые веса для слоев
w1=np.array([[-0.5, 1, 0.5], [-0.5, 1, 0.5]])
w2=np.array([[0.5, -0.5],[0.5, -0.5]])
w3=np.array([0.5, -0.5])
#персептрон 3/2/2/1
def go(inp):
     t=np.dot(w1, inp)
     n1=np.array([f(x) for x in t])
     t2=np.dot(w2, n1)
     n2=np.array([f(x) for x in t2])
     t3=np.dot(w3, n2)
     y=f(t3)
     return (y, n1, n2)
#тренировка обратным распространением
def train(epoch):
     global w3, w2, w1
     lmd=0.01
     N=20000
     count=len(epoch)
     for k in range(N):
          x=epoch[np.random.randint(0, count)]
          y, n1, n2=go(x[0:3])
          e=y-x[-1]
#корректировка весов связей последнего (выходного) 
слоя
          delta=e*df(y)
          w3[0]=w3[0]-n2[0]*delta*lmd
          w3[1]=w3[1]-n2[1]*delta*lmd
#коррекция весов связей среднего (скрытого) слоя
          delta2=w3*delta*df(n2)
          w2[0]=w2[0]-np.array(n1[0])*delta2[0]*lmd
          w2[1]=w2[1]-np.array(n1[1])*delta2[0]*lmd
          w2[0]=w2[0]-np.array(n1[0])*delta2[1]*lmd
          w2[1]=w2[1]-np.array(n1[1])*delta2[1]*lmd
#корректировка весов связей первого (входного) слоя
          delta3=w2*delta2*df(n1)
          w1[0, :]=w1[0, :]-np.array(x[0:3])*delta3[0]*lmd
          w1[1, :]=w1[1, :]-np.array(x[0:3])*delta3[1]*lmd

Ответы (1 шт):

Автор решения: MaxU

Судя по ошибке, вы пытаетесь перемножить две 1D матрицы, состоящие из единственной строки, причем строки в этих двух матрицах разной длины. Так делать нельзя.

Воспроизведение ошибки:

In [42]: np.array([1,2,3]) * np.array([2,4])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-42-ed7f5e5a5a15> in <module>
----> 1 np.array([1,2,3]) * np.array([2,4])

ValueError: operands could not be broadcast together with shapes (3,) (2,)

Вместо этого можно умножать 1D одномерную матрицу, состоящую из единственной строки, на 1D матрицу, состоящую из единственной столбца:

In [43]: np.array([1,2,3]) * np.array([[2],[4]])
Out[43]:
array([[ 2,  4,  6],
       [ 4,  8, 12]])

или наоборот:

In [44]: np.array([[2],[4]]) * np.array([1,2,3])
Out[44]:
array([[ 2,  4,  6],
       [ 4,  8, 12]])
→ Ссылка