Понимание функции обратной связи в книге Майкла Нильсена

В настоящее время я читаю его потрясающую книгу ( http://neuralnetworksanddeeplearning.com/chap1.html) и думаю, что до сих пор я неплохо справляюсь с большинством этих вещей. Математика требует некоторого размышления, но управляема.

То, что просто не хочет иметь никакого смысла для меня, - то, что делает функция обратной связи и как она может работать. Я не мог получить его так долго, что решил, что мне нужно создать акк и попросить о помощи.

    def feedforward(self, a):
    """Return the output of the network if ``a`` is input."""
    for b, w in zip(self.biases, self.weights):
        a = sigmoid(np.dot(w, a)+b)
    return a

Теперь вы можете сказать: "Эй, это довольно просто, чего нельзя понять об этом", и в основном вы правы. Но что меня беспокоит, так это то, что эта сеть должна классифицировать цифры - и код, кажется, работает просто отлично. Если я запускаю его на своей машине, он показывает мне прогресс, как и должно быть. Итак, результат net.feedforward(image) должен быть массив с 10 записями, который указывает, по какой цифре сеть классифицирует нашу картинку. Но фактический результат - массив с 10 умноженными на 30 записей -> Это заставляет мою голову болеть. Кажется, что ни суммирование этих записей, ни их усреднение не дают чего-то близкого к желаемому (0,0,0,0,1,0,0,0,0,0), которое вы хотели бы получить для изображения 4. Четное более странная часть этого в том, что остальная часть кода, кажется, предполагает, что получит именно это:

    def evaluate(self, test_data):
    """Return the number of test inputs for which the neural
    network outputs the correct result. Note that the neural
    network's output is assumed to be the index of whichever
    neuron in the final layer has the highest activation."""
    test_results = [(np.argmax(self.feedforward(x)), y)
                    for (x, y) in test_data]
    return sum(int(x == y) for (x, y) in test_results)

Если я сделаю это: test=net.feedforward(image) а затем использовать np.argmax(test) Я получаю произвольный результат в зависимости от ввода от 0 до 299, а не от 0 до 9, как ожидается в функции.

Тем не менее код, кажется, работает - это сводит меня с ума. Какое объяснение этому разрешает узел в моей голове?

1 ответ

По сути, ваша функция обратной связи возвращает 10 сигмовидных значений для каждого входа, каждое из которых указывает, насколько "уверена" сеть в этом выходе. Чтобы получить правильный прогноз для каждого входа, необходимо передать аргумент оси в функцию argmax, в противном случае выходные данные являются индексом наибольшего значения в выходных данных WHOLE. Что вам нужно, так это наибольшее значение для каждой КОЛОННЫ (или строки, той, которая указывает каждый образец).

Надеюсь это поможет

[Редактировать]

из документов Numpy для argmax:

ось: int, необязательно. По умолчанию индекс находится в плоском массиве, в противном случае вдоль указанной оси.

Это говорит вам, почему вы получаете неправильный результат

Другие вопросы по тегам