我正在尝试实施反向传播算法,以展示如何将两层神经网络用作XOR逻辑门。我遵循了本教程here。
运行后,我希望输出遵循XOR逻辑真值表:
[[0]
[1]
[1]
[0]]
但是我得到了
output after training: [[0.5]
[0.5]
[0.5]
[0.5]]
关于我可能做错了什么的任何建议?谢谢
完整代码:
import numpy as np
# Sigmoid function
def sigmoid(x, deriv=False):
if deriv:
return x*(1-x)
return 1/(1+np.exp(-x))
# Input dataset
X = np.array([[0, 0],
[0, 1],
[1, 0],
[1, 1]])
# Output dataset
y = np.array([[0, 1, 1, 0]]).T
# seed random numbers to make calculation deterministic
np.random.seed(1)
# initialise weights randomly with mean 0
syn0 = 2*np.random.random((2, 1)) - 1
for iter in range(10000):
# forward prop
layer0 = X
layer1 = sigmoid(np.dot(layer0, syn0))
layer1_error = y - layer1
layer1_delta = layer1_error * sigmoid(layer1, True)
syn0 += np.dot(layer0.T, layer1_delta)
print(iter)
print("output after training: ", layer1)
答案 0 :(得分:4)
您没有做错任何事情-您已经正确证明了单层ANN无法执行non-linear separation!
XOR输入是不可线性分离的数据的示例-简单地说,如果将它们绘制在x-y网格上,则不能绘制直线来将“ 0”输出与“ 1”输出分开。单层人工神经网络只能执行线性分离,因此无论您如何训练都无法产生正确的输出。
要解决XOR问题,您需要添加一个额外的层。似乎已经有两层(输入层和输出层),但实际上它是单层网络,因为只有一层权重(syn0
)。添加第二层(按照您提供的参考中的示例),然后查看培训结果是否得到改善。