#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. Не мог бы кто-нибудь предложить возможную причину, пожалуйста?
Правка: Я пробовал другие числа для узлов, и это все еще не работает. Я также просмотрел свои заметки, и, похоже, я кодирую именно данные уравнения, поэтому я не знаю, в чем здесь проблема.