繁体   English   中英

Python简单的神经网络代码不起作用

[英]Python simple neural network code not working

我正在尝试学习神经网络,并编写了一个简单的反向传播神经网络,该网络使用S型激活函数和随机权重初始化。 我正在尝试在输入层中使用两个输入值3和2以及在输出层中使用目标输出6进行乘法。 当我执行代码时, w1w2的值会不断增加,并且不会停留在正确的值上。

我对Python和神经网络都是陌生的,感谢您的帮助。

import numpy as np
al0 = 3
bl0 = 2 
import random
w1 =random.random()
w2 =random.random()
b = 0.234
ol1 = 6
def sigm(x,deriv=False):
   if deriv==True:
       return x*(1-x)
   return 1/(1+np.exp(-x))
y = sigm(x)
E = 1/2*(ol1 - y)**2
dsig = sigm(x,True)
dyE = y-ol1

for iter in range(10000):
    syn0 = al0*w1
    syn1 = bl0*w2
    x = syn0 + syn1 + b
    dtotal1 = dyE*dsig*al0
    w1 = w1 + 0.01*dtotal1
    dtotal2 = dyE*dsig*bl0
    w2 = w2 + 0.01*dtotal2
w1
w2

首先,您需要按顺序获取代码。 这些线

y = sigm(x)
E = 1/2*(ol1 - y)**2
dsig = sigm(x,True)
dyE = y-ol1

需要在x = syn0 + syn1 + b之后发生在for循环内。

接下来,有一些神经网络项目要解决。 是反向传播的技术说明。

sigm(x)的导数为sigm(x) * (1 - sigm(x)) ,或者在您的情况下为y * (1 - y) ,如您所实现的,则为sigm(y,True)

您的偏见也需要更新。 这是网络的重要组成部分,是学习的参数。 您可以使用:

dtotalb = dyE*dsig*1
b = b - 0.01*dtotalb

乘以1是不必要的,但很有启发性。 这是相对于b的“ net”项的导数,您称x为1。

您可能已经注意到,我给了b的更新使用-而不是+ 上方链接中此部分的最后一行显示了此步骤,以确保更新朝着正确的方向进行,以最大程度地减少错误。

最后,考虑网络可以输出的可能值。 最终输出y是调用sigm(x)的结果。 y可以采用的值在打开间隔(0,1)中。 但是,您的网络正在尝试学习6的值。它可以获取的最接近值几乎是1。因此,当您继续进行迭代时,权重将继续增加以尝试增加S型输出。 权重将无限期增长。

完成所有这些更改后,请尝试将目标设置为(0,1),例如0.6。 当我进行所有这些更改时,我能够使E减小到接近0,并且使您的权重收敛。

旁注 :为了使您的网络学习6的值,您将需要没有激活功能的另一层权重。 或者,您可以删除激活功能,但是随后您开始失去尝试学习的神经网络方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM