简单的神经网络
从零编写一个简单的神经网络模型,网络模型采用三层架构,分别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)
#想要随机的取值在[-1,1]之间,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