本文用于学习反向传播算法!!!
#单隐层神经网络使用反向传播算法训练模型 import numpy as np #使用sigmoid激活函数 def sigmoid(x,deriv=False): if(deriv==True): return (1-x)*x return 1/(1+np.exp(-x)) #训练数据集 x=np.array([[0,0,1], [0,1,1], [1,0,1], [1,1,1], [0,0,1]]) y=np.array([[0], [1], [1], [0], [0]]) #权重随机初始化 np.random.seed(2) w0 = 2*np.random.random((3,4))-1 w1 = 2*np.random.random((4,1))-1 for i in range(10000): #前向传播 l0 = x l1 = sigmoid(np.dot(l0,w0)) l2 = sigmoid(np.dot(l1,w1)) l2_error = -(y-l2) if(i%1000==0): print("error"+str(np.mean(np.abs(l2_error)))) #反向传播 l2_delta = l2_error*sigmoid(l2,True) #输出层的误差 w_ho_pd = l1.T.dot(l2_delta) #隐层到输出层w的偏导 l1_error = l2_delta.dot(w1.T) l1_delta = l1_error*sigmoid(l1,True) #隐藏层的误差 w_ih_pd = l0.T.dot(l1_delta) #输入层到隐层w的偏导 w1 -= w_ho_pd w0 -= w_ih_pd def predict_model(x,w0,w1): l1 = sigmoid(np.dot(x,w0)) l2 = sigmoid(np.dot(l1,w1)) if l2>=0.5: print("1") else: print("0") predict_model([0,1,1],w0,w1)
参考资料:
1. BP算法 https://www.jianshu.com/p/c5cda5a52ee4
2. 唐宇迪 教学视频
文章来源: 反向传播算法