python - 神经网络 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]]
])
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 个输入并计算错误。我非常希望它保持这种状态,而不是一遍又一遍地转发整个测试数据。
有什么办法可以做到吗?先感谢您 :)
解决方案
你有一个小的实现错误:
在反向传播中,您评估:
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 对我有用,但你可以微调它。
推荐阅读
- spring-boot - Spring序列化的双数格式
- visual-studio - 升级到 Visual Studio 2019 16.7.1 后,程序挂起
- python - 在 vscode 中为 python 配置智能感知时需要帮助
- android - 存在实施时禁用中介网络 (Android Admob)
- gnuplot - 是否可以调整 gnuplot 方框图的高度?
- typescript - NodeJS FactoryGirl:错误:“代码”列中的空值违反非空约束
- python - Python多处理一个工人动态所有工人数据的接收者数量(1:n)
- docker - Jenkins 声明式管道调用方法阶段
- amazon-web-services - 如何查找特定区域和实例类型的 AMI ID?
- postgresql - 将 bytea 转换回 varchar