从零开始写一个简单的神经网络,只有三层,假设第一层3个特征,第二层4个隐藏单元,第三层1个输出。
代码实现如下:
import numpy as np
def sigmoid(x,deriv=False): #Falae表示反向传播,true表示前向传播
if(deriv==True):
return x*(1-x)#反向传播,sigmoid函数对x进行求导之后的结果,注意理解此时的x表示什么
return 1/(1+np.exp(-x))#前向传播
#构造数据
x=np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1],[0,0,1]])#5个训练集样本,3个特征
y=np.array([[0],[1],[1],[0],[0]])
print(x.shape)
print(y.shape)
#随机初始化权重参数,为了大家得到相同的结果,设置一个种子
np.random.seed(1)
w0=2*np.random.random((4,3))-1 #想要随机的取值在[-1,1]之间,w0=np.random.random((4,3)) 的随机值在[0,1]之间
#四行三列,第一层和第二层之间的权重参数,第二层四个神经元,第一层三个特征
w1=2*np.random.random((1,4))-1
#一行三列,第三层一个神经元,第二层四个神经元
#L0-输入层,L1-隐藏层,L2-输出层
for j in range(200000):#迭代次数
L0=x
L1=sigmoid(np.dot(w0,L0.T))#L1层激活单元矩阵
#print(L1.shape)#4*5
L2=sigmoid(np.dot(w1,L1))#L2层激活单元矩阵
#print(L2.shape)#1*5
L2_error=L2-y.T #预测值和真实值之间的误差
#print(L2_error)#1*5
if j%10000==0: #显示每一万次的迭代结果
print('Error:'+str(np.mean(np.abs(L2_error))))
L2_delta= L2_error * sigmoid(L2,deriv=True) # * 不是矩阵相乘,是对应相乘的关系
#print(L2_delta.shape)#1*5
L1_error=w1.T .dot(L2_delta)
#print(L1_error.shape)#4*5
L1_delta=L1_error * sigmoid(L1,deriv=True)
#print(L1_error.shape)#4*5
w1 -=L2_delta .dot(L1.T)
w0 -=L1_delta .dot(L0)
实现的结果如下:
Error:0.49304415101158944
Error:0.008733661798063603
Error:0.005983098335375742
Error:0.004818624149692894
Error:0.004138987538377107
Error:0.00368118662042358
Error:0.0033463164129527594
Error:0.003087832443319351
Error:0.0028805982789439567
Error:0.0027096998991903002
Error:0.0025656593731400307
Error:0.0024421289061420082
Error:0.00233467711647648
Error:0.002240104704196693
Error:0.0021560367246882548
Error:0.002080668410754011
Error:0.0020126005998093053
Error:0.001950729693124533
Error:0.001894172011839109
Error:0.001842210530210427
网友评论