简单的神经网络

简单的神经网络

从零编写一个简单的神经网络模型,网络模型采用三层架构,分别L0,L1,L2层。假设第一层3个特征(x1,x2,x3),第二层5个神经元,第三层一个输出。

代码实现如下:

import numpy as np

#定义一个sigmoid函数
def sigmoid(x,deriv=False): #False表示正向传播,True表示反向传播
	if deriv==True:
		return x*(1-x) #反向传播,sigmoid函数对x求导(注意x表示什么)
	return 1/(1+np.exp(-x)) #正向传播

#构建数据
#x表示5个训练集样本,3个特征
x=np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1],[0,0,1]])  # x.shape=5*3
y=np.array([[0],[1],[1],[0],[0]])  # y.shape=5*1

#随机初始化权重参数,为了得到相同的结果,设置一个种子
np.random.seed(1)
#想要随机的取值在[-11]之间,np.random.random((5,3))的取值在[0,1]之间
#w0权重参数,五行三列,第一层三个特征(输入),第二层五个神经元
w0=2*np.random.random((5,3))-1 #w0.shape(5*3)
#w1权重参数,一行五列,第三层一个神经元(输出),第二层五个神经元
w1=2*np.random.random((1,5))-1 #w1.shape(1*5)

#L0-输入层 L1-隐藏层 L2-输出层

for i in range(200000): #迭代次数200000
	L0=x #5*3
	#L1层激活单元矩阵
	L1=sigmoid(np.dot(w0,L0.T)) #5*5 
	#L2层激活单元矩阵
	L2=sigmoid(np.dot(w1,L1)) #1*5

	#得到的L2预测值与真实值y之间的误差
	L2_error=L2-y.T #1*5
	
	if i%10000==0: #显示每10000的迭代结果
		print("ERROR:"+str(np.mean(np.abs(L2_error))))
	
	#反向求导
	L2_delta=L2_error * sigmoid(L2,deriv=True) #1*5 不是矩阵相乘,是对应相乘
	L1_error=w1.T .dot(L2_delta) #5*5
	L1_delta=L1_error * sigmoid(L1,deriv=True) #5*5
	w1=w1-L2_delta.dot(L1) #1*5
	w0=w0-L1_delta.dot(L0) #5*3
	

实验结果如下:

ERROR:0.47623293376696657
ERROR:0.006051666884928206
ERROR:0.004165157389013795
ERROR:0.0033625266317263364
ERROR:0.0028926903427863955
ERROR:0.002575570488905583
ERROR:0.0023432574852742466
ERROR:0.0021637266232400823
ERROR:0.0020196546091931352
ERROR:0.0019007494572889055
ERROR:0.0018004632864876003
ERROR:0.0017144065263201853
ERROR:0.0016395123057161953
ERROR:0.00157356485203203
ERROR:0.0015149182685343045
ERROR:0.0014623210855210966
ERROR:0.001414802584411034
ERROR:0.0013715967418066462
ERROR:0.0013320899177631444
ERROR:0.0012957840000224993
发布了1 篇原创文章 · 获赞 2 · 访问量 186

猜你喜欢

转载自blog.csdn.net/hxx123520/article/details/104002636
今日推荐