Реализация обратного распространения с Softmax - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь реализовать обратное распространение в нейронной сети с входным слоем, скрытым слоем и выходным слоем, используя 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)
...