python - python中的简单神经网络不起作用,可能是反向传播算法的问题?
问题描述
我制作了一个小型神经网络,它接受两个输入 x,y 和输出 z,一个 1 或 0。有一个隐藏层,有两个神经元 h1,h2 和一个输出层中的神经元。输入是高度和宽度,0 到 100 之间的整数,类别有大有小(例如 10,8 是“小”,76,92 是“大”)。有线性和非线性数据类型。我使用了 sigmoid 激活函数,并在权重和偏差方面使用偏微分进行反向传播。我没有使用任何 Ml 库。我正在尝试直接对大多数数学进行编码。我无法让它工作。也许我在反向传播算法中犯了一个错误,因为这是最具挑战性的部分。我希望有人能指出我做错了什么。下面是代码:
import random, numpy, math
lr = 1 #learning rate
dt = '1' #data type
epochs = 100000
tda = 50 #training data amount
def step(x): #step function
if x > 0:
x = 1
else:
x = 0
return x
def error(truth, output):
return 0.5 * (truth - output)**2
def sig(x): #sigmoid activation
return 1/(1+numpy.exp(-x))
#weights
w = [random.random(),random.random(),random.random(),random.random(),random.random(),random.random()]
biases
b = [random.random(),random.random(),random.random()]
def Net(x, y, t) : # t is truth (or target)
h1 = x*w[0]+y*w[1]+b[0] #summation in h1, first neuron in hidden layer
h1out = sig(h1) #sigmoid activation
h2 = x*w[2]+y*w[3]+b[1]
h2out = sig(h2)
z = h1out*w[4]+h2out*w[5]+b[2] #z is output neuron
zout = sig(z)
e = error(t, zout) # e is error
#backpropagation, partial differentiations to find error at each weight and bias
e5 = (zout-t) * (zout * (1 - zout)) * h1out #e5 is error at 5th weight etc
e6 = (zout-t) * (zout * (1 - zout)) * h2out
e1 = (zout-t) * (zout * (1 - zout)) * w[4] * (h1out * (1 - h1out)) * x
e2 = (zout-t) * (zout * (1 - zout)) * w[4] * (h1out * (1 - h1out)) * y
e3 = (zout-t) * (zout * (1 - zout)) * w[5] * (h2out * (1 - h2out)) * x
e4 = (zout-t) * (zout * (1 - zout)) * w[5] * (h2out * (1 - h2out)) * y
be3 = (zout-t) * (zout * (1 - zout)) error at 3rd bias etc
be1 = (zout-t) * (zout * (1 - zout)) * w[4] * (h1out * (1 - h1out))
be2 = (zout-t) * (zout * (1 - zout)) * w[5] * (h2out * (1 - h2out))
#print (e1, e2, e3, e4, e5, e6, be1, be2, be3)
#updating weights and biases
w[0] = w[0] - (e1 * lr)
w[1] = w[1] - (e2 * lr)
w[2] = w[2] - (e3 * lr)
w[3] = w[3] - (e4 * lr)
w[4] = w[4] - (e5 * lr)
w[5] = w[5] - (e6 * lr)
b[2] = b[2] - (be3 * lr)
b[0] = b[0] - (be1 * lr)
b[1] = b[1] - (be2 * lr)
解决方案
你的反向传播应该是这样的:
并且继续减少更深的层次。所以你基本上必须通过它的激活函数的导数来计算每个神经元的误差。并将其用于先前层的错误。
推荐阅读
- javascript - 如何从由斜杠分隔的 url 中获取 url 参数,例如 http://myweb.com/example/12345/222/4444 我想从上面的 url 中获取 12345、222、4444
- java - tomcat 7 到 9 迁移:java.lang.IllegalArgumentException:指定的主资源集 [...] 无效
- javascript - 引导日期时间选择器未打开
- magento - magento 2.3 安装后黑屏
- python - 从 Music21 保存图像文件
- swift - 如何将来自uiimageView的图像存储在firebase中
- ios - 如何在 Swift 的注释视图上显示不同的图标?
- javascript - 调用 google API json 文件并将其显示为 html,未检索到数据但成功调用站点
- reactjs - 与 haul 不工作的本地反应,引发一些 loader 问题
- javascript - 下拉链接未显示在 HTML 表格中