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