BP神经网络
BP神经网络也就是误差反向传播
解决了多层神经网络的学习问题,极大促进了神经网络的发展.
BP神经网络也是整个人工神经网络体系中的精华,广泛应用于分类识别,逼近,回归,压缩等领域.在实际应用中,大约80%
的神经网络模型都采取了BP网络或BP网络的变化形式.
Delta学习规则,也就是权值的改变
......................................................................................................................................
输出层学习信号
第l层学习信号,第l - l+1层权值,第l层的输入信号
Tanh**函数: Softsign **函数:
ReLU**函数: f(u) = max(0,u) : 当x小于0的时候这个函数直接等于0,如果大于0的话,就是一个线性
BP神经网络解决异或问题
数据: [[1,1],[0,1],[1,0],[0,0]]
# BP神经网络 import numpy as np # 输入数据 X = np.array([[1,0,0],[1,0,1],[1,1,0],[1,1,1]]) # 标签 Y = np.array([[0,1,1,0]]) #权值初始化,取值范围-1到1,因为有两层神经元,所以需要两个权值的初始化 V = np.random.random((3,4))*2-1 # 隐藏层的权值 W = np.random.random((4,1))*2-1 # 输出层的权值 # 学习率设置 lr = 0.11 def sigmoid(x):# 它的取值范围是0,1 ,所以本来的Y = np.array([[-1,1,1,-1]])需要改成以上 return 1/(1+np.exp(-x)) def dsigmoid(x): # 导数 return x*(1-x) def update():# 更新权值函数 global X,Y,W,V,lr L1 = sigmoid(np.dot(X,V)) # 隐藏层输出(4,4) L2 = sigmoid(np.dot(L1,W)) #输出层输出(4,1) L2_delta = (Y.T - L2) * dsigmoid(L2) # dsigmoid(L2)**层的倒数 L1_delta = L2_delta.dot(W.T) * dsigmoid(L1) W_C = lr * L1.T.dot(L2_delta) # 改变权值的公式 V_C = lr * X.T.dot(L1_delta) # 改变权值的公式 W = W + W_C V = V + V_C for i in range(20000): update()#更新权值 if i % 500 == 0: L1 = sigmoid(np.dot(X,V)) # 隐藏层输出(4,4) L2 = sigmoid(np.dot(L1,W)) #输出层输出(4,1) #求误差 abs(Y.T - L2) 理想的输出值减去 实际的值取正数,然后求平均值 print('Error:',np.mean(abs(Y.T - L2))) # 迭代完成之后看一下实际的输出值 L1 = sigmoid(np.dot(X,V)) # 隐藏层输出(4,4) L2 = sigmoid(np.dot(L1,W)) #输出层输出(4,1) print(L2) # 无限接近于0和1就对了,0,1,1,0