猿问

神经网络 XOR 返回不正确的输出

我想知道为什么我的神经网络不起作用。我想说我对此提出了类似的问题,但我仍然有一些我不明白的事情......


代码:


import numpy as np

inputs = np.array([

    [[0],[0]],

    [[1],[0]],

    [[0],[1]],

    [[1],[1]]

])


expected_output = np.array([

    [0],

    [1],

    [1],

    [0]

])


epochs = 100

lr = 0.2


hidden_weights = np.array([

    [0.2, 0.3],

    [0.4, 0.5]

])

hidden_bias = np.array([[0.3], [0.6]])


output_weights = np.array([[0.6, 0.7]])

output_bias = np.array([[0.5]])


def sigmoid(z):

    return 1/(1+np.exp(-z))


def sigmoid_derivative(z):

    return z * (1.0-z)


for _ in range(epochs):

    for index, input in enumerate(inputs):

        hidden_layer_activation = np.dot(hidden_weights, input)

        hidden_layer_activation += hidden_bias

        hidden_layer_output = sigmoid(hidden_layer_activation)


        output_layer_activation = np.dot(output_weights, hidden_layer_output)

        output_layer_activation += output_bias

        predicted_output = sigmoid(output_layer_activation)


        #Backpropagation

        output_errors = expected_output[index] - predicted_output

        hidden_errors = output_weights.T.dot(output_errors)

        d_predicted_output = output_errors * sigmoid_derivative(predicted_output)

        d_hidden_layer = hidden_errors * sigmoid_derivative(hidden_layer_output)


        output_weights += np.dot(d_predicted_output, hidden_layer_output.T) * lr

        hidden_weights += np.dot(d_hidden_layer, input.T) * lr


        output_bias += np.sum(d_predicted_output) * lr

        hidden_bias += np.sum(d_hidden_layer) * lr


# NOW THE TESTING,I pass 2 input neurons. One with value 1 and value 1

test = np.array([

    [[1], [1]]

])


我已经测试了前馈传播,它工作正常。错误似乎很好。


我认为更新权重是问题,但更新权重有正确的公式。这段代码来自《制作你自己的神经网络》一书,它与我使用的几乎相同:


self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 ­ final_outputs)), numpy.transpose(hidden_outputs))

目前我当时只转发 2 个神经元的 1 个输入并计算错误。我非常希望它保持这种状态,而不是一遍又一遍地转发整个测试数据。


有什么办法可以做到吗?先感谢您 :)


慕斯709654
浏览 101回答 1
1回答

红糖糍粑

你有一个小的实现错误:在反向传播中,您评估:hidden_errors = output_weights.T.dot(output_errors)但是您的隐藏错误必须根据 d_predicted_output 进行评估,如下所示:hidden_errors = output_weights.T.dot(d_predicted_output)此外,您应该降低学习率并增加 epoch 数。10000 epochs 和 lr = 0.1 对我有用,但你可以微调它。
随时随地看视频慕课网APP

相关分类

Python
我要回答