Зачем транспонировать матрицу здесь? (Нейронная сеть связана) - PullRequest
1 голос
/ 22 апреля 2020

пока я смотрю коды для понимания нейронной сети, я удивляюсь этому коду.

hidden_errors = numpy.dot(self.who.T, output_errors)
# The error of the hidden layer is calculated by recombining the errors of the output layer divided by the weight.

В этом коде зачем транспонировать матрицу?

Я боюсь нарушения авторское право, весь код будет публиковать адрес оригинального кода на GitHub.

https://github.com/freebz/Make-Your-Own-Neural-Network/blob/master/neural_network.py

1 Ответ

1 голос
/ 22 апреля 2020

Транспонирование необходимо для того, чтобы скалярное произведение (в данном случае эквивалентное умножению матрицы) было возможно и вычислилось правильно.

self.who создается в строке:

numpy.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))

, что делает ее матрицей OxH, где O (строки) - это количество выходных узлов, а H (столбцы) - количество скрытых узлов. targets создается в строке:

targets = numpy.array(targets_list, ndmin=2).T

, что делает его матрицей Ox1 (2D). output_errors - это то же измерение, что и targets, а также вектор-столбец Ox1 со значениями O (как и следовало ожидать):

output_errors = targets - final_outputs

В реализованном алгоритме обратного распространения скрытые ошибки рассчитываются путем предварительного умножения ошибки вывода весами, соединяющими скрытый слой с выходным слоем. Из numpy do c из numpy.dot:

Если a и b являются двумерными массивами, это матричное умножение, но с использованием matmul или a @ b является предпочтительным.

Таким образом, нам нужно преобразовать self.who в матрицу HxO, чтобы она правильно работала при умножении на матрицу Ox1, чтобы получить требуемую матрицу скрытых ошибок Hx1.

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