我试图在神经网络中实现一个异或,其类型包括两个输入、一个隐藏层中的元素和一个输出。但是学习速度真的很差(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))发布于 2017-12-10 05:24:17
你需要小心处理像这样的语句
学习率很差
通常情况下,学习速度是梯度下降在负梯度方向上的步长。所以,我不知道你所说的糟糕的学习速度是什么意思。
我也不确定我是否正确地理解了你的代码,但是神经网络的前一步基本上是隐藏层的权矩阵乘以输入向量的矩阵乘法。这将(如果您正确设置一切)将产生一个矩阵,它等于您的隐藏层的大小。现在,在将逻辑函数按元素应用到这个矩阵之前,您可以简单地添加偏差。
h_i = f(h_i+bias_in)然后,您可以对隐藏层执行相同的操作,乘以输出权重,并应用其激活来获取输出。
o_j = f(o_j+bias_h)向后一步是计算输出和隐藏层的三角洲,包括使用函数的另一个元素级操作。
Sigmoid_output_to_derivative(输出)
并使用梯度更新两个权重矩阵(这里需要学习率来定义步长)。梯度只是对应节点乘以其增量的值。注意:对输出节点和隐藏节点的增量进行了不同的计算。
我建议你为这些偏见保留不同的变量。因为现代方法通常通过总结其连接音符的增量来更新这些数据,因此学习速度不同,并从特定的偏倚中减去这一乘积。
看看下面的教程(它使用了numpy):
part04/
https://stackoverflow.com/questions/47723487
复制相似问题