您的位置:首页 > 理论基础 > 计算机网络

【神经网络】3:BP神经网络解决异或问题

2018-01-21 11:34 465 查看
前言:依据当今神经网络的发展,80%以上的神经网络都是BP神经网络或者是它的升级版。

—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-

—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-

一、BP神经网络的介绍

作为最经典的神经网络,简单介绍一下:

BP神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念;

BP——back propagation,也就是逆向传播的意思,通俗的说就是:用模型得到的预测值与真实值之间的误差,来影响改变之前各层间的权重

1、BP算法介绍



先介绍几个符号代表的意思:(都是向量式

X——输入值(数据项);Y——真实值(标签项)

V——输入层连接隐藏层的权重;W——隐藏层连接输出层的权重

L1——隐藏层的值(输入层的值X经过权重V作用后的输出值)

L2——预测值(隐藏层的值L1经过权重W作用后的输出值,也就是模型预测值)

BP算法的工作流程:

输入值X经过权重V的作用,再通过激活函数处理,得到隐藏层的输入值L1

同时L1也是隐藏层的输出值,L1经过权重W的作用,再经过激活函数处理,得到预测值L2

用梯度下降法计算输出层的误差改变量:真实值Y与预测值L2之间的误差与L2的负梯度相乘,得到输出层的误差改变量L2_delta

用梯度下降法计算隐藏层的误差改变量:用输出层的误差改变量L2_delta乘权重W再与L1的负梯度相乘,得到隐藏层的误差改变量L1_delta

各层误差改变量与学习率相乘,再与各层原有权重相加,得到更新后权重V_、W_

用更新后的权重V_、W_迭代计算,重复以上步骤,直到满足一定条件时,输出最后预测值

2、BP神经网络解决异或

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing
# -*- 2018/01/12;14:37
# -*- python3.5

import numpy as np

lr = 0.11        #学习速率

#输入数据分别:偏置值,x1,x2
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
#print('输入层连接隐藏层的权值V:',V)
#print('隐藏层连接输出层的权值W:',W)

def sigmoid(x):
return 1/(1+np.exp(-x))

def dsigmoid(x):
return x*(1-x)

#更新权重函数
def get_update():
global X,Y,W,V,lr
# L1:输入层传递给隐藏层的值;输入层3个节点,隐藏层4个节点
# L2:隐藏层传递到输出层的值;输出层1个节点
L1 = sigmoid(np.dot(X,V))
L2 = sigmoid(np.dot(L1,W))

# L2_delta:输出层的误差改变量
# L1_delta:隐藏层的误差改变量
L2_delta = (Y.T - L2)*dsigmoid(L2)
L1_delta = L2_delta.dot(W.T)*dsigmoid(L1)

# W_C:输出层对隐藏层的权重改变量
# V_C:隐藏层对输入层的权重改变量
W_C = lr * L1.T.dot(L2_delta)
V_C = lr * X.T.dot(L1_delta)

# 更新后的权重
W = W + W_C
V = V + V_C

def main():
for i in range(10000):
get_update()
if i%500 == 0:
L1 = sigmoid(np.dot(X, V))
L2 = sigmoid(np.dot(L1, W))
print('当前误差',np.mean(np.abs(Y.T - L2)))
L1 = sigmoid(np.dot(X, V))
L2 = sigmoid(np.dot(L1, W))
print('最后逼近值:',L2)

if __name__ == "__main__":
main()


效果展示:



可以看到经过迭代,误差越来越小,最后逼近的值很接近标签项[0,1,1,0]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息