简单神经网络(复习用)

import numpy as np
#网络只有l0l1l2三层,在l1l2层有sigmoid
def sigmoid(x,deriv = False): #sigmoid函数主要分为前向传播和求导两部分
    if(deriv == True):
        return x*(1 - x) #注意这里的x并不是前向的x,此处x = sigmoidx(前向))
    return 1/(1 + np.exp(-x))

x = np.array([[0,0,1], #五个训练点:5x3
             [0,1,1],
             [1,0,1],
             [1,1,1],
             [0,0,1]])

y = np.array([[0],[1],[1],[0],[0]]) #与训练点对应的分类结果:5x1

np.random.seed(1)

w0 = 2 * np.random.random((3,4)) - 1 #初始化w0w1两个
w1 = 2 * np.random.random((4,1)) - 1

for j in range(1000): #开始梯度下降来训练w0w1
    l0 = x
    l1 = sigmoid(np.dot(l0,w0))
    l2 = sigmoid(np.dot(l1,w1)) #先将正向传播中的两个神经元值算出
    l2_error = y - l2 #与结果的差异
    if j % 10000 == 0:
        print('l2_Error:'+str(np.mean(np.abs(l2_error))))
    l2_delta = l2_error * sigmoid(l2,deriv=True) #l2_error来作为梯度下降中的α,当l2_error越大,说明训练结果与真实结果差异较大,梯度下降的步伐(l2_error)越大
    l1_error = l2_delta.dot(w1.T) #造成最终差异的两个贡献点:不仅是sigmoid函数贡献,还有网络中线性部分w1对差异的贡献
    l1_delta = l1_error * sigmoid(l1,deriv=True)

    w1 += l1.T.dot(l2_delta) #更新w0w1:注意加号(l2_error计算中y-l2相关) 更新w:最终差异对w的偏导就是:(差异导sigmoidl2))*l1    w0 += l0.T.dot(l1_delta)

你可能感兴趣的:(简单神经网络)