深度学习入门笔记(三)————BP神经网络解决异或问题(代码)

一  网络结构

深度学习入门笔记(三)————BP神经网络解决异或问题(代码)_第1张图片

\bigl(\begin{smallmatrix} x_{0} &x_{1} &x_{2} \end{smallmatrix}\bigr)\begin{pmatrix} v_{00}&v_{01} &v_{02} &v_{03} \\ v_{10}&v_{11} &v_{12} &v_{13} \\ v_{20}&v_{21} &v_{22} &v_{23} \end{pmatrix} = \begin{pmatrix} y_{0}&y_{1} &y_{2} &y_{3} \end{pmatrix}

 \begin{pmatrix} y_{0}&y_{1} &y_{2} &y_{3} \end{pmatrix}\bigl(\begin{smallmatrix} w_{0}\\ w_{1}\\ w_{2}\\ w_{3} \end{smallmatrix}\bigr) = O

二 代码

  1.  导入包
import numpy as np
import matplotlib.pyplot as plt

2.输入数据

X = np.array([[1,0,0],[1,0,1],[1,1,0],[1,1,1]])

3.定义标签

#标签 0 0 为 0 10 为1 01 为1 11 为0
Y = np.array([[0,1,1,0]])

 4.初始化

#权值初始化 有两层 所以两个权值  取值范围 -1,1
V = np.random.random((3,4))*2-1   
W = np.random.random((4,1))*2-1
print(W)

#学习率
lr = 0.11

 5.定义函数

#定义sigmoid函数
def sigmoid(x):
	return 1/(1+np.exp(-x))
	
#定义sigmoid函数导数
def dsigmoid(x):
	return x*(1-x)

 f(x) = \frac{1}{1+e^{-x}}      f{}'(x)=f(x)[1-f(x)]

6.更新权值

#更新权值函数
def update():
	global X,Y,W,V,lr
	
	L1 = sigmoid(np.dot(X,V))   #隐藏层的输出 输入层矩阵与权值矩阵相乘 (4,4) y
	L2 = sigmoid(np.dot(L1,W))  #输出层的输出  隐藏层的输出矩阵与权值矩阵相乘(4,1) o
	
	L2_delta = (Y.T - L2)*dsigmoid(L2)   #输出层的误差信号
	L1_delta = L2_delta.dot(W.T)*dsigmoid(L1)	#隐藏层的误差信号
	
	W_C = lr*L1.dot(L2_delta)   #w的改变值 
	V_C = lr*X.T.dot(L1_delta)	#v的改变值
	
	W = W + W_C
	V = V + V_C

 

 7.迭代 开始训练

#迭代	
for i in range(20000):
	update()  #更新权值
	if i%500 == 0:		#每500次查看一次
			L1 = sigmoid(np.dot(X,V))   #隐藏层的输出 输入层矩阵与权值矩阵相乘 (4,4) y
			L2 = sigmoid(np.dot(L1,W))  #输出层的输出 实际输出  隐藏层的输出矩阵与权值矩阵相乘(4,1) o
			print('Error:',np.mean(np.abs(Y.T-L2)))  

L1 = sigmoid(np.dot(X,V))   #隐藏层的输出 输入层矩阵与权值矩阵相乘 (4,4) y
L2 = sigmoid(np.dot(L1,W))  #输出层的输出  隐藏层的输出矩阵与权值矩阵相乘(4,1) o			
print(L2)

 8.显示

#显示
def judge(x):
	if x >= 0.5:
		return 1
	else:
		return 0
		
for i in map(judge,L2):
	print(i)

运行效果

深度学习入门笔记(三)————BP神经网络解决异或问题(代码)_第2张图片

你可能感兴趣的:(深度学习)