Вычисление дельты для обучения обратным распространением ошибки

Собрал пятислойную нейронную сеть: 3/3/3/2/1. Собираюсь обучать ее методом обратного распространения ошибки (back propagation). Но столкнулся с проблемой вычисления дельты для входного и следующего за ним слоями. Пробовал и так и эдак транспонировать перемножаемые составляющие дельты - никак не выходит, у них разная размерность. Есть ли какой-то способ или реализовать метод обратного распространения ошибки на сети с такой архитектурой в принципе невозможно?

import numpy as np
#функции активации
def sigma(x):
     return 1/(1+np.exp(-x))
def der_sigma(x):
     return x*(1-x)
#стартовые веса слоев
w1=np.array([[-0.5, 0.5, 0.5], [-0.5, 0.5, 0.5], [-0.5, 0.5, 0.5]])
w2=np.array([[-0.5, 0.5, 0.5], [-0.5, 0.5, 0.5], [-0.5, 0.5, 0.5]])
w3=np.array([[-0.5, 0.5, 0.5], [-0.5, 0.5, 0.5]])
w4=np.array([-0.5, 0.5])
#сеть
def go(x):
     S1=np.dot(w1, x)
     A1=np.array([sigma(x) for x in S1])
     S2=np.dot(w2, A1)
     A2=np.array([sigma(x) for x in S2])
     S3=np.dot(w3, A2)
     A3=np.array([sigma(x) for x in S3])
     S4=np.dot(w4, A3)
     A4=sigma(S4)
     return (A1, A2, A3, A4)
#тренировка обратным распространением
def train(epoch):
     global w4, w3, w2, w1
     step=0.1
     N=1000
     count=len(epoch)
     for k in range(N):
          x=epoch[np.random.randint(0, count)]
          A1, A2, A3, A4=go(x[0:-1])
          e=A4-x[-1]
#коррекция весов четвертого слоя
          delta4=e*der_sigma(A4)
          w4[0]=w4[0]-A3[0]*delta4*step
          w4[1]=w4[1]-A3[1]*delta4*step
#коррекция весов третьего слоя
          delta3=w4*delta4*der_sigma(A3)
          w3[0,0]=w3[0,0]-A2[0]*delta3[0]*step
          w3[0,1]=w3[0,1]-A2[1]*delta3[0]*step
          w3[0,2]=w3[0,2]-A2[2]*delta3[0]*step
          w3[1,0]=w3[1,0]-A2[0]*delta3[1]*step
          w3[1,1]=w3[1,1]-A2[1]*delta3[1]*step
          w3[1,2]=w3[1,2]-A2[2]*delta3[1]*step
#коррекция весов второго слоя
          delta2=(delta3*w3.T).T*der_sigma(A2)#не уверен что правильно
          w2[0,:]=w2[0,:]-A1[0]*delta2[0]*step
          w2[0,:]=w2[0,:]-A1[1]*delta2[1]*step
          w2[1,:]=w2[1,:]-A1[0]*delta2[0]*step
          w2[1,:]=w2[1,:]-A1[1]*delta2[1]*step
          w2[2,:]=w2[2,:]-A1[0]*delta2[0]*step
          w2[2,:]=w2[2,:]-A1[1]*delta2[1]*step
#коррекция весов первого слоя
          delta1=w2*delta2*der_sigma(A1)#???

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