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)
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)
运行效果