Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python简单的神经网络代码不工作_Python_Numpy_Neural Network - Fatal编程技术网

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

Python简单的神经网络代码不工作,python,numpy,neural-network,Python,Numpy,Neural Network,我试图学习神经网络,并编写了一个简单的反向传播神经网络,它使用sigmoid激活函数和随机权重初始化。我试着在输入层用两个输入值3和2相乘,在输出层用目标输出值6相乘。当我执行代码时,w1和w2的值会不断增加,并且不会在正确的值处停止 我对Python和神经网络都是新手,非常感谢您的帮助 import numpy as np al0 = 3 bl0 = 2 import random w1 =random.random() w2 =random.random() b = 0.234 ol1 =

我试图学习神经网络,并编写了一个简单的反向传播神经网络,它使用sigmoid激活函数和随机权重初始化。我试着在输入层用两个输入值3和2相乘,在输出层用目标输出值6相乘。当我执行代码时,
w1
w2
的值会不断增加,并且不会在正确的值处停止

我对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
需要在for循环内部,在
x=syn0+syn1+b
之后发生

接下来,有几个神经网络项目需要解决。是对backprop的技术描述

sigm(x)
的导数是
sigm(x)*(1-sigm(x))
,或者在您的例子中是
y*(1-y)
,您已经实现了
sigm(y,True)

你的偏见也需要更新。这是网络的关键部分,也是一个学习参数。您可以使用:

dtotalb = dyE*dsig*1
b = b - 0.01*dtotalb
乘以1是不必要的,但很有启发性。这是“净”术语的导数,您称之为
x
,与
b
,即1有关

您可能已经注意到,我为b提供的更新使用了
-
而不是
+
。上面链接中的最后一行显示,这是确保更新方向正确以最小化错误所必需的

最后,考虑网络可能输出的可能值。最终输出
y
是调用
sigm(x)
的结果。
y
可以采用的值在开放区间(0,1)内。然而,您的网络正在尝试了解6的价值。它能得到的最接近值几乎是1。因此,当您继续迭代时,权重将继续增加,以尝试增加sigmoid的输出值。体重将无限增长

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


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

它看起来就像你在分配它之前使用了
x
。我预计
w1
w2
会继续增加,因为你会在你的循环中不断地向它们添加正数。谢谢:)它正在工作,w1=0.19459141500196783,w2=-0.12292840082904191,b=0.06754766476035066,y=0.600000000000014。。我有一个疑问,我可以知道为什么w2值为负吗?一般来说,很难知道为什么特定的权重取特定的值。优化可以找到许多其他权重和偏差设置,将误差降低到0。随机初始化将影响找到的最小值。对于您的简单问题,
x
需要稍微大于0才能达到0.6的目标。由于
w1
b
都是正的,
w2
通过负的方式进行补偿。