神经网络XOR返回错误输出

我想知道为什么我的神经网络不起作用。我之前问过类似的问题,但仍然有一些我不理解的地方…

代码:

import numpy as npinputs = np.array([    [[0],[0]],    [[1],[0]],    [[0],[1]],    [[1],[1]]])expected_output = np.array([    [0],    [1],    [1],    [0]])epochs = 100lr = 0.2hidden_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 1test = np.array([    [[1], [1]]])hidden_layer_activation = np.dot(hidden_weights, test[0])hidden_layer_activation += hidden_biashidden_layer_output = sigmoid(hidden_layer_activation)output_layer_activation = np.dot(output_weights, hidden_layer_output)output_layer_activation += output_biaspredicted_output = sigmoid(output_layer_activation)print(predicted_output)
结果 : [[0.5]] 输入为1和1期望 : [[0]] 输入为1和1

我已经测试了前向传播,运行正常。错误看起来也正确。

我以为更新权重是问题所在,但更新权重的公式是正确的。这段代码来自《自制神经网络》这本书,和我使用的方法非常相似:

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

目前我一次只前向传递两个神经元中的一个输入并计算误差。我非常希望能保持这种方式,而不是反复传递整个测试数据。

有什么方法可以做到这一点吗?提前谢谢你 🙂


回答:

你有一个小的实现错误 :

在反向传播中,你计算的是 :

hidden_errors = output_weights.T.dot(output_errors)

但你的隐藏层误差应该基于d_predicted_output来计算,像这样 :

hidden_errors = output_weights.T.dot(d_predicted_output)

另外,你应该降低学习率并增加轮数。10000轮和学习率0.1对我来说有效,但你可以根据需要进行微调。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注