下面我就一个简单的例子来说明一下自己对于神经网络的理解和认识。
输入层包含两个输入项,隐藏层包含两个项(隐含层为一层),输出层为两个。
个人理解(文字)
相应代码
import numpy as np
import matplotlib.pyplot as plt
import math
x=np.array([0.05,0.10])#输入层
w1=np.array([[0.15,0.25],[0.2,0.3]])#输入层到隐藏层(一)
w2=np.array([[0.4,0.5],[0.45,0.55]])#隐藏层到输出层(二)
y=np.array([0.01,0.99])#输出层
b1=0.35#(一)偏置
b2=0.6#(二)偏置
q=0.5#学习率
def neth(x,w1,b1):
return np.dot(x,w1)+b1
def outh():
outh=[]
for i in range(len(w1[0])):
a=1/(math.exp(-neth(x,w1,b1)[i])+1)#sigmod
outh.append(a)
return np.array(outh)
def neto():
return np.dot(outh(),w2)+b2
def outo():
outo=[]
for i in range(len(w2[0])):
a=1/(math.exp(-neto()[i])+1)
outo.append(a)
return np.array(outo)
s=0#迭代次数
num=[]#存储迭代次数值
result=[]#存储每次迭代中的损失值
while True:
s=s+1
dif=[[0,0],[0,0]]#初始化
dif1=[[0,0],
[0,0]]
a=0
#更新w5-w8
for i in range (len(w2)):
for j in range(len(w2[i])):
dif1[i][j]=(-(y[j]-outo()[j]))*(outo()[j]*(1-outo()[j]))*(outh()[i])#梯度
w2[i][j]=w2[i][j]-q*dif1[i][j]#梯度下降
#更新w1-w4
for i in range(len(w1)):
for j in range(len(outo())):
a=a+(-(y[j]-outo()[j]))*outo()[j]*(1-outo()[j])*w2[i][j]
for k in range (len(w1[i])):
dif[i][k]=a*(outh()[k]*(1-outh()[k]))*x[i]
w1[i][k]=w1[i][k]-q*dif[i][k]
e=np.sum((y-outo())**2/2)#损失值
result.append(e)#记录损失值
num.append(s)#记录迭代次数
if e<0.00001:
break
plt.plot(num,result)
plt.show()
print(outo())
print(s)
print(e)
代码的运行结果:
下面是代码中参数的更新中涉及的一点推导:
以上就是对一个简单三层神经网络的简单介绍希望能帮助大家更好的理解神经网络。