我试图在神经网络中实现XOR,其类型为2个输入,隐藏层中有1个元素,1个输出。但是学习率非常差(0,5)。我认为这是因为我错过了输入和输出之间的连接,但我不确定如何做到这一点。我已经建立了偏见连接,以便学习更好。只使用Numpy。
def sigmoid_output_to_derivative(output):
return output*(1-output)
a=0.1
X = np.array([[0,0],
[0,1],
[1,0],
[1,1]])
np.random.seed(1)
y = np.array([[0],
[1],
[1],
[0]])
bias = np.ones(4)
X = np.c_[bias, X]
synapse_0 = 2*np.random.random((3,1)) - 1
synapse_1 = 2*np.random.random((1,1)) - 1
for j in (0,600000):
layer_0 = X
layer_1 = sigmoid(np.dot(layer_0,synapse_0))
layer_2 = sigmoid(np.dot(layer_1,synapse_1))
layer_2_error = layer_2 - y
if (j% 10000) == 0:
print( "Error after "+str(j)+" iterations:" + str(np.mean(np.abs(layer_2_error))))
layer_2_delta = layer_2_error*sigmoid_output_to_derivative(layer_2)
layer_1_error = layer_2_delta.dot(synapse_1.T)
layer_1_delta = layer_1_error * sigmoid_output_to_derivative(layer_1)
synapse_1 -= a *(layer_1.T.dot(layer_2_delta))
synapse_0 -= a *(layer_0.T.dot(layer_1_delta))
答案 0 :(得分:1)
你需要注意像
这样的陈述学习率不好
通常学习率是梯度下降在负梯度方向上的步长。所以,我不确定你的学习率是多少。
我也不确定我是否正确理解你的代码,但神经网络的前向步骤基本上是隐藏层的权重矩阵乘以输入向量的矩阵乘法。这将(如果您正确设置所有内容)导致矩阵等于隐藏层的大小。现在,您可以在将逻辑函数元素应用于此矩阵之前添加偏差。
h_i = f(h_i+bias_in)
之后,您可以对隐藏图层执行相同的操作,然后按输出权重并应用其激活来获取输出。
o_j = f(o_j+bias_h)
向后步骤是计算输出和隐藏层的增量,包括使用函数的另一个元素运算
sigmoid_output_to_derivative(输出)
并使用渐变更新两个权重矩阵(此处需要学习速率来定义步长)。梯度只是相应节点的值乘以其delta。 注意:对于输出和隐藏节点,增量的计算方式不同。
我建议你为偏见保留单独的变量。因为现代方法通常通过总结其连接音符的增量乘以不同的学习速率来更新它们,并从特定偏差中减去该产品。
看看下面的教程(它使用numpy):
http://peterroelants.github.io/posts/neural_network_implementation_part04/