DL之DNN:基于自定义数据集(numpy定义)利用浅层DNN(numpy定义非线性神经网络/sigmoid函数)实现二分类(BP神经网络解决异或问题)
目录
基于自定义数据集(numpy定义)利用浅层DNN(numpy定义非线性神经网络/sigmoid函数)实现二分类(BP神经网络解决异或问题)
1、设计思路
2、二层神经网络的数学计算逻辑
3、输出结果
4、实现代码
基于自定义数据集(numpy定义)利用浅层DNN(numpy定义非线性神经网络/sigmoid函数)实现二分类(BP神经网络解决异或问题) 1、设计思路# 1、定义数据 # 2、定义DNN模型 # 2.1、定义DNN网络参数 # 定义权值:初始化,3行4列,取值范围[-1,1] #设置学习率 # 2.2、定义sigmoid函数及其导数 # 定义sigmoid函数及其导数 # 定义更新权值的函数 # 模型训练输出 # 2.3、定义损失函数 # 2.4、定义模型输出逻辑 # 2.5、定义模型输出判断
2、二层神经网络的数学计算逻辑# DL之DNN:基于自定义数据集(numpy定义)利用浅层DNN(numpy定义非线性神经网络/sigmoid函数)实现二分类(BP神经网络解决异或问题)
import numpy as np
#1、定义数据
# 第一列的数字1表示偏置
X = np.array ([[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1]])
#标签
Y = np.array ([[0, 1, 1, 0]]) #两个中括号代表二维。分别对应00、01、10、11
# 2、定义DNN模型
# 2.1、定义DNN网络参数
# 定义权值:初始化,3行4列,取值范围[-1,1]
V = np.random.randn(3,4)*2-1
W = np.random.randn(4,1)*2-1
#设置学习率
lr = 0.11
# 2.2、定义sigmoid函数及其导数
def sigmoid(z):
return(1 / (1 + np.exp(-z)))
def dsigmoid(z):
return z*(1-z)
# 定义更新权值的函数
def update():
global X,Y,W,V,lr #当自定义的函数需要调用外部的参数时,需要利用global进行声明为全局变量
L1=sigmoid(np.dot(X,V)) #隐藏层输出4*4
L2=sigmoid(np.dot(L1,W)) #输出层输出4*1
L2_delta=(Y.T-L2)*dsigmoid(L2) #Y.T就是Y的转置
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(3000):
# 2.3、定义损失函数
update() #更新权值
if i%500==0:
L1=sigmoid(np.dot(X,V)) #隐藏层输出4*4,输入层矩阵与权值矩阵相乘
L2=sigmoid(np.dot(L1,W)) #输出层输出4*1,实际输出,隐藏层的输出矩阵与权值矩阵相乘(4,1)
print("error:",np.mean(np.abs(Y.T-L2)))
# 2.4、定义模型输出逻辑
L1=sigmoid(np.dot(X,V)) #隐藏层输出4*4
L2=sigmoid(np.dot(L1,W)) #输出层输出4*1
print('L2:\n',L2)
# 2.5、定义模型输出判断
def judge(a):
if a>=0.5:
return 1
else:
return 0
for i in map(judge,L2):
print(i)