首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异或神经网络2-1-1

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

Stack Overflow用户
提问于 2017-12-08 23:15:10
回答 1查看 121关注 0票数 0

我试图在神经网络中实现一个异或,其类型包括两个输入、一个隐藏层中的元素和一个输出。但是学习速度真的很差(0,5)。我认为这是因为我错过了输入和输出之间的联系,但我不太清楚该如何做。我已经做了偏见的联系,以便学习更好。只使用Numpy。

代码语言:javascript
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-10 05:24:17

你需要小心处理像这样的语句

学习率很差

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

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

代码语言:javascript
复制
h_i = f(h_i+bias_in)

然后,您可以对隐藏层执行相同的操作,乘以输出权重,并应用其激活来获取输出。

代码语言:javascript
复制
o_j = f(o_j+bias_h)

向后一步是计算输出和隐藏层的三角洲,包括使用函数的另一个元素级操作。

Sigmoid_output_to_derivative(输出)

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

我建议你为这些偏见保留不同的变量。因为现代方法通常通过总结其连接音符的增量来更新这些数据,因此学习速度不同,并从特定的偏倚中减去这一乘积。

看看下面的教程(它使用了numpy):

part04/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47723487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档