【问题标题】:Neural networks XOR returns incorrect output神经网络 XOR 返回不正确的输出
【发布时间】:2020-08-14 06:00:18
【问题描述】:

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

代码:

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]]
])

hidden_layer_activation = np.dot(hidden_weights, test[0])
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)

print(predicted_output)
Result : [[0.5]] for inputs 1 and 1

Wanted : [[0]] for inputs 1 and 1

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

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

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

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

有什么办法可以做到吗? 提前谢谢你:)

【问题讨论】:

  • 你能显示训练好的权重吗?
  • 输出权重。 = [[0.21595628 0.23063487]] hidden_​​weights = [ [-0.03163078 0.08377066] [ 0.22549171 0.32939786]] 结构至少是正确的

标签: python numpy machine-learning neural-network


【解决方案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 对我有用,但你可以微调它。

【讨论】:

  • 耶稣我是愚蠢的,我很愚蠢,谢谢你,MANNNNN SO MUCCHHHHHHHH 问题是链式规则......我用 1 的学习率对其进行了测试,它仍然有效。我不知道为什么它需要 10000 epochs..也许是因为我当时依赖 1 个输入
  • 是的,您可以添加批次以减少 epoch 的数量。您可以绘制每个 epoch 的损失,看看您真正需要多少个 epoch,10k 可能太多了
猜你喜欢
  • 1970-01-01
  • 2019-07-17
  • 2023-03-23
  • 2014-05-09
  • 2015-02-04
  • 2019-03-15
  • 2016-05-13
  • 2015-07-21
  • 2016-11-28
相关资源
最近更新 更多