神经网络及反向BP

下面我就一个简单的例子来说明一下自己对于神经网络的理解和认识。
输入层包含两个输入项,隐藏层包含两个项(隐含层为一层),输出层为两个。
在这里插入图片描述
个人理解(文字)
在这里插入图片描述

相应代码

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)

代码的运行结果:
在这里插入图片描述
下面是代码中参数的更新中涉及的一点推导:
在这里插入图片描述

以上就是对一个简单三层神经网络的简单介绍希望能帮助大家更好的理解神经网络。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值