Python 异或神经网络2-1-1

Python 异或神经网络2-1-1,python,numpy,Python,Numpy,我试图在神经网络中实现一个异或运算,类型为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)

我试图在神经网络中实现一个异或运算,类型为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))

你需要小心这样的陈述

学习率很差

通常,学习速率是梯度下降在负梯度方向上的步长。所以,我不知道你说的学习率差是什么意思

我也不确定我是否正确理解了你的代码,但神经网络的前进步骤基本上是隐层权重矩阵乘以输入向量的矩阵乘法。这将(如果您正确设置所有内容)生成一个矩阵,该矩阵等于隐藏层的大小。现在,在将逻辑函数元素化应用于该矩阵之前,您可以简单地添加偏差

h_i = f(h_i+bias_in)
之后,您可以对隐藏层执行与输出权重相同的操作,并应用其激活以获得输出

o_j = f(o_j+bias_h)
向后的步骤是计算输出层和隐藏层的增量,包括函数的另一个元素操作

sigmoid_输出_到_导数(输出)

并使用梯度更新两个权重矩阵(这里需要学习率来定义步长)。渐变只是对应节点的值乘以其增量。 注意:为输出节点和隐藏节点计算的增量不同

我建议你为偏差保留单独的变量。因为现代方法通常通过将其相连音符的增量乘以不同的学习率,并从特定偏差中减去该乘积来更新这些方法

请看以下教程(它使用numpy):