Я пытаюсь реализовать обратное распространение в нейронной сети с входным слоем, скрытым слоем и выходным слоем, используя Softmax в последнем слое, и я не вижу, что не так.Я знаю, что производная перекрестной потери энтропии по отношению к выходу - цели / результаты.Я также знаю, что производная перекрестной энтропии по отношению к входам последнего слоя - это выходы - цели, но, похоже, она не сходится.Что я делаю не так?
def _one_hidden_layer_train(self, inputs, targets):
inputs = np.array(inputs, ndmin = 2).T
targets = np.array(targets, ndmin = 2).T
# Executes a Linear Combination
hidden_inputs = np.dot(self.wih, inputs)
# Executes Activation Function
hidden_outputs = self.hidden_activation_function(hidden_inputs)
# Executes a Linear Combination
final_inputs = np.dot(self.who, hidden_outputs)
# Executes Activation Function
outputs = np.exp(final_inputs - np.max(final_inputs )) / np.sum(np.exp(final_inputs - np.max(final_inputs )))
# output layer error is the (target - actual)
output_errors = (- targets / outputs)
# update the weights for the links between the hidden and output layers
self.who += self.learning_rate * np.dot((outputs - targets), hidden_outputs.T)
# first hidden layer error is the second_hidden_errors, split by weights, recombined at first hidden layer nodes
hidden_errors = np.dot(self.who.T, output_errors)
# update the weights for the links between the first hidden layer and input layer
self.wih += self.learning_rate * np.dot((hidden_errors * self.hidden_activation_derivative(hidden_inputs)), inputs.T)