理解无库的MLP神经网络Python

2024-05-16 14:32:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难学习神经网络。让我们从我的理解开始。在获得结果的阶段,它很简单,权重*输入+偏差,并应用函数(sigmoid)。 我的问题是在反向传播阶段,就像你的计算或者你对神经元数量的错误选择一样

让我们了解一下我对反向传播的理解: 预期产量,, 做你的导数,转置上一层,用从输出中得到的误差*计算梯度,修正偏差和权重,我的结果有时是随机的

    # INPUT -> HIDDEN

    matriz_inputs = array_matrix(inputs)
    hidden = self.weights_ih@matriz_inputs + self.bias_ih
    hidden = 1/(1+np.exp(-hidden))

    # HIDDEN -> OUTPUT

    output = self.weights_ho@hidden + self.bias_ho
    output = 1/(1+np.exp(-output))
    
    # # BACKPROPAGATION

    # OUTPUT -> HIDDEN
    expected = array_matrix(target)
    output_error = expected - output
    derivate_output = output*(1-output)

    hidden_T = hidden.T

    gradient = output_error*derivate_output
    gradient = gradient*self.learning_rate

    self.bias_ho = self.bias_ho+gradient

    delta_weights_ho = gradient@hidden_T
    self.weights_ho = self.weights_ho+delta_weights_ho


    # HIDDEN -> INPUT

    weights_ho_T = self.weights_ho.T

    hidden_error = weights_ho_T@output_error
    derivate_hidden = hidden*(1-hidden)

    matriz_inputs_T = matriz_inputs.T

    gradient_H = hidden_error*derivate_hidden
    gradient_H = gradient_H*self.learning_rate

    self.bias_ih = self.bias_ih+gradient_H

    delta_weights_ih = gradient_H@matriz_inputs_T
    self.weights_ih = self.weights_ih+delta_weights_ih

这是培训代码

这里有一些出口

enter image description here

enter image description here

预期[0,0,1,1],第二张图像显示正确的校正,但第一张图像显示不正确。异或问题

Neurons are:
input (i) = 2
hidden (h) = 2
output (o) = 1

错误发生的频率随着隐藏层或层数的变化而变化(我只编码了一层,但在另一个代码中编码了几个)

我的问题在于计算或神经元,因为对于4个(隐藏的神经元),这个错误并没有发生

编辑: 我发布了代码的图像,因为我知道它们更容易可视化,因为我的问题不在于它的执行,而在于对计算和数据选择的理解,而不是执行它所必需的


Tags: selfoutput错误errorhiddendeltainputsweights