机器学习之神经网络实战

作者: 你要好好学习呀 | 来源:发表于2019-03-13 09:39 被阅读0次

从零开始写一个简单的神经网络,只有三层,假设第一层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

相关文章

网友评论

    本文标题:机器学习之神经网络实战

    本文链接:https://www.haomeiwen.com/subject/rtoapqtx.html