【问题标题】:Python simple neural network code not workingPython简单的神经网络代码不起作用
【发布时间】:2019-01-23 17:54:41
【问题描述】:

我正在尝试了解神经网络并编写了一个简单的反向传播神经网络,该网络使用 sigmoid 激活函数和随机权重初始化。我尝试在输入层中与两个输入值 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

【问题讨论】:

  • 在分配之前,您似乎在使用x
  • 我预计 w1w2 会继续增加,因为看起来你会在循环中不断地向它们添加正数。

标签: python numpy neural-network


【解决方案1】:

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

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

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

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

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 提供的更新使用 - 而不是 +。上面链接中this section 的最后一行表明,这对于确保更新朝着正确的方向进行以最大程度地减少错误是必要的。

最后,考虑您的网络可以输出的可能值。最终输出y 是调用sigm(x) 的结果。 y 可以取的值在开区间 (0,1) 内。但是,您的网络正在尝试学习 6 的值。它可以得到的最接近的值几乎是 1。因此,随着您继续迭代,权重将继续增加以尝试增加 sigmoid 的输出值。权重会无限增长。

通过所有这些更改,尝试将目标设置为 (0,1),例如0.6。当我进行所有这些更改时,我可以让E 减少到接近 0 并且你的权重会收敛。

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

【讨论】:

  • 谢谢 :) 它工作正常,w1 = 0.19459141500196783,w2 = -0.12292840082904191,b = 0.06754766476035066,y = 0.600000000000000014.. 我有查询,可能是负值
  • 一般来说,很难知道为什么特定的权重具有特定的值。优化可以找到许多其他的权重和偏差设置,将误差减少到 0。随机初始化将影响找到的最小值。对于您的简单问题,x 需要略大于 0 才能获得 0.6 的目标。由于w1b 都是正数,所以w2 通过负数进行补偿。
猜你喜欢
  • 1970-01-01
  • 2020-12-09
  • 2021-11-03
  • 2016-08-08
  • 2022-01-08
  • 2018-04-10
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
相关资源
最近更新 更多