Нужна помощь в вычислении дельта-члена в обратном распространении нейронной сети

#python #neural-network

Вопрос:

Я пытаюсь реализовать 3-слойную нейронную сеть со следующими размерами: 400 объектов, 40 узлов, 40 узлов, 10 целей. Итак, мои три вектора параметров определены следующим образом:

 theta1 = np.random.uniform(low=0.00001, high=0.0001, size=(40,401))
theta2 = np.random.uniform(low=0.00001, high=0.0001, size=(40,41))
theta3 = np.random.uniform(low=0.00001, high=0.0001, size=(10,41))
 

У меня не было проблем с продвижением вперед. Я столкнулся с проблемой при реализации обратного распространения. Я получаю ошибку значения при использовании np.matmul для вычисления части delta2. Код приведен ниже:

 def backward_prop3(y_vectors, a1, a2, a3, a4, theta1, theta2, theta3, lamb):
   #backward propagation
   #y_vectors is vectors of results (number of rows = number of targets, number of columns = number of training examples)
   #a1 is the features, a2 and a3 are the nodes, a4 is the output
   #lambda is the
   #outputs gradient arrays for theta1 and theta2 and theta2

   m = y_vectors.shape[1]

   delta4 = a4 - y_vectors

   delta3_matmul_term = np.matmul(np.transpose(theta3),delta4)
   delta3_dot_term = np.multiply(a3, np.ones(a3.shape)-a3)
   delta3 = np.multiply(delta3_matmul_term,delta3_dot_term)
   triangle3 = np.matmul(delta4, np.transpose(a3))

   delta2_matmul_term = np.matmul(np.transpose(theta2),delta3) #problem occurred on this line
   delta2_dot_term = np.multiply(a2, np.ones(a2.shape)-a2)
   delta2 = np.multiply(delta2_matmul_term,delta2_dot_term)
   triangle2 = np.matmul(delta3, np.transpose(a2))

   triangle1 = np.matmul(delta2[1:,:],np.transpose(a1))

   
   grad3 = (1/m)*triangle3 

   grad2 = (1/m)*triangle2 

   grad1 = (1/m)*triangle1 

   return grad1, grad2, grad3
 

Странно то, что у меня не было проблем с вычислением delta3, но возникла проблема с вычислением delta2. Поскольку код для дельты 3 и дельты 2, по сути, одно и то же, я не понимаю, почему он работал для дельты 3, а не для дельты 2. Не мог бы кто-нибудь предложить возможную причину, пожалуйста?

Правка: Я пробовал другие числа для узлов, и это все еще не работает. Я также просмотрел свои заметки, и, похоже, я кодирую именно данные уравнения, поэтому я не знаю, в чем здесь проблема.