BP神经网络

BP神经网络也就是误差反向传播

解决了多层神经网络的学习问题,极大促进了神经网络的发展.

BP神经网络也是整个人工神经网络体系中的精华,广泛应用于分类识别,逼近,回归,压缩等领域.在实际应用中,大约80%

的神经网络模型都采取了BP网络或BP网络的变化形式.

BP神经网络

BP神经网络

Delta学习规则,也就是权值的改变

BP神经网络

......................................................................................................................................

BP神经网络   输出层学习信号

BP神经网络  第l层学习信号,BP神经网络第l - l+1层权值,BP神经网络第l层的输入信号

Tanh**函数:BP神经网络    Softsign **函数:BP神经网络

ReLU**函数: f(u) =  max(0,u) : 当x小于0的时候这个函数直接等于0,如果大于0的话,就是一个线性

 BP神经网络解决异或问题

数据: [[1,1],[0,1],[1,0],[0,0]]

BP神经网络

# 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