import numpy as np #网络只有l0,l1,l2三层,在l1和l2层有sigmoid def sigmoid(x,deriv = False): #sigmoid函数主要分为前向传播和求导两部分 if(deriv == True): return x*(1 - x) #注意这里的x并不是前向的x,此处x = sigmoid(x(前向)) 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 #初始化w0和w1两个 w1 = 2 * np.random.random((4,1)) - 1 for j in range(1000): #开始梯度下降来训练w0和w1 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) #更新w0和w1:注意加号(l2_error计算中y-l2相关) 更新w:最终差异对w的偏导就是:(差异导sigmoid(l2))*(l1) w0 += l0.T.dot(l1_delta)
简单神经网络(复习用)
最新推荐文章于 2024-05-28 23:10:44 发布