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

Я сейчас читаю его удивительную книгу (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 Ответ

0 голосов
/ 28 мая 2018

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...