首页 > 解决方案 > 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)

标签: pythonbackpropagation

解决方案


你的反向传播应该是这样的:

并且继续减少更深的层次。所以你基本上必须通过它的激活函数的导数来计算每个神经元的误差。并将其用于先前层的错误。


推荐阅读