当我看代码来理解神经网络时,我对这段代码感到好奇。
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
为了使点积(在这种情况下相当于矩阵乘法(成为可能并计算正确的东西,转置是必要的。
self.who
在以下行中创建:
numpy.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))
其中O(行(是输出节点的数量,H(列(是隐藏节点的数量。targets
在以下行中创建:
targets = numpy.array(targets_list, ndmin=2).T
这使得它成为Ox1(2D(矩阵。那么output_errors
与targets
的维度相同,并且也是O值的Ox1列向量(正如所预期的(:
output_errors = targets - final_outputs
在所实现的反向传播算法中,通过将输出误差与连接隐藏层和输出层的权重相乘来计算隐藏误差。来自numpy.dot
:的numpy文档
如果a和b都是2-D数组,则为矩阵乘法,但最好使用matmul或a@b。
因此,我们需要将self.who
转置为HxO矩阵,以便在与Ox1矩阵相乘时正确工作,从而给出所需的隐藏误差的Hx1矩阵。