首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双神经元神经网络

双神经元神经网络
EN

Stack Overflow用户
提问于 2017-10-04 09:31:56
回答 2查看 404关注 0票数 2

我试着用python从头开始实现一个简单的神经网络。该神经网络只有两个神经元,其任务是将输入与输出相匹配。(即x=0->输出= 0,x=1->输出= 1)

我使用了偏导数,并试图最大限度地利用梯度上升负损失。(完整的代码如下所示)即使经过超过10000次的迭代训练,输出仍然不够好。(我认为损失可能是在当地的最大值。)有人能帮我找出我的实现出了什么问题吗。

代码语言:javascript
复制
import random
import numpy as np
import math

def sigmoid(x):
  return 1 / (1 + np.exp(-x))

def error(d,z):
    return -0.5 * np.sum(np.power(d-z, 2))

# x = input
##x = np.random.choice((0,1),10000)
x = np.array([0, 1])
# y = desired output
d = np.copy(x)

# weights of two neurons
w = np.random.rand(2)

# now training using backprop
gradient = np.random.rand(2)

iterations = 800
rate = 5

k = 1
for i in xrange(1, iterations + 1):
    y = sigmoid(w[0] * x)
    z = sigmoid(w[1] * y)

    gradient[0] = np.sum(z * w[1] * y * x * (d-z) * (1-y) * (1-z))
    gradient[1] = np.sum(y * z * (d-z) * (1-z))

    w[0] += gradient[0] * rate
    w[1] += gradient[1] * rate

    print "Iteration %d, Error %f, Change %f" % (i, error(d,z), ((gradient[0] * rate) ** 2 + (gradient[1] * rate) ** 2)**0.5)

    change = ((gradient[0] * rate) ** 2 + (gradient[1] * rate) ** 2)**0.5

    if change < 0.00001:
        break

## now test
print "1",
x = 1
y = sigmoid(w[0]*x)
z = sigmoid(w[1]*y)
print z

print "0",
x = 0
y = sigmoid(w[0]*x)
z = sigmoid(w[1]*y)
print z
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-04 10:02:01

您的简单网络无法学习此功能。

问题是神经元缺乏偏见。如果我们将您的两个权重称为W1和W2,您就会发现问题所在:

  • 如果输入为0,则W1没有区别,第一层的输出为0.5,第二层的输出为sigmoid( 0.5 * W2 )。要学习输出值为0,则网络必须使W2大而负。
  • 如果输入为1,则第一层的调用输出为N,必须在0到1之间,第二层的输出为sigmoid( N * W2 )。如果W2是大的和负的,那么网络所能做的最好就是为W1学习一个很大的负权重,使N接近于零。但是,这最多还是要学习如何输出< 0.5,因为sigmoid(0)0.5

无论您选择何种权重,0,1输入都不能接近0,1输出。解决方案是在第二层中增加至少一个偏倚项,尽管对每个神经元都有一个偏倚是更正常的。

票数 1
EN

Stack Overflow用户

发布于 2017-10-04 09:48:04

请参阅在执行反向传播之前对数据进行规范化。也许这会有帮助!

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

https://stackoverflow.com/questions/46561514

复制
相关文章

相似问题

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