1.计算图

  • 背景

神经网络通过数值微分计算神经网络的权重参数的梯度(即损失函数关于权重参数的梯度)
数值微分虽然简单,容易实现,但是计算比较耗时。

  • 优点

计算图的特征是可以通过传递“局部计算结果“获得最终结果。
可以通过正向传播和反向传播高效地计算各个变量的导数值。

  • 模型

计算图将神经网络的计算过程通过数据的图结构表示出来。
(“从左往右进行计算”是一种正方向上的传播(从计算图出发点到结束点的传播),简称为正向传播;反之,则为反向传播。)

2.链式法则定义

如果某一个函数是由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示。
计算图与链式法则:

3.反向传播

反向传播局部导数的传递,是基于链式法则的。

反向传播的计算顺序:先将节点的输入信号乘以节点的局部导数(偏导数),然后再传递给下一个节点。

案例:苹果含税(乘法层);苹果和橘子含税(既包含乘法层,也包含加法层)
说明:关于程序中"backward"中“self.x”和“self.y"互换可以这样理解:
若苹果的费用(price)=苹果的价格(apple)*苹果的数量(apple_num),则苹果费用对苹果单价的导数则为苹果的数量;反之为苹果的单价。

程序源码

class MulLayer:def __init__(self):#self.x=None#self.y=Noneself.x,self.y=None,Nonedef forward(self,x,y):#self.x=x#self.y=yself.x,self.y=x,yout=x*yreturn outdef backward(self,dout):#dout为上游传来的导数dx=dout*self.y#反转x和ydy=dout*self.xreturn dx,dyclass AddLayer:def __init__(self):passdef forward(self,x,y):return x+ydef backward(self,dout):dx=dout*1dy=dout*1return dx,dyif __name__=="__main__":apple=100apple_num=2tax=1.1mul_apple_layer=MulLayer()mul_tax_layer=MulLayer()dprice=1print("苹果-->正向传播".center(50,"-"))apple_price=mul_apple_layer.forward(apple,apple_num)#1print("未缴税的价格{}".format(int(apple_price)))print("mul_apple_layer初始值:self.x-->{},self.y-->{}".format(mul_apple_layer.x,mul_apple_layer.y))price=mul_tax_layer.forward(apple_price,tax)#2print("mul_tax_layer初始值:self.x-->{},self.y-->{}".format(mul_tax_layer.x,mul_tax_layer.y))print("交税后的价格{}".format(int(price)))print("苹果-->反向传播".center(50,"="))dapple_price,dtax=mul_tax_layer.backward(dprice)print("税率{},消费税的导数{}".format(dapple_price,dtax))dapple,dapple_num=mul_apple_layer.backward(dapple_price)print("苹果单价的导数{},苹果数量的导数{}".format(dapple,int(dapple_num)))for i in range(3):print("\n")######苹果和橘子mul_apple_layer2=MulLayer()mul_orange_layer2=MulLayer()add_apple_orange_layer=AddLayer()mul_tax_layer2=MulLayer()orange=150orange_num=3print("苹果和橘子-->正向传播".center(50,"-"))#forwardapple_price=mul_apple_layer2.forward(apple,apple_num)#1orange_price=mul_orange_layer2.forward(orange,orange_num)#2all_price=add_apple_orange_layer.forward(apple_price,orange_price)#3price=mul_tax_layer2.forward(all_price,tax)#4print("苹果和橘子的总费用{},以及交税后的价格{}".format(all_price,int(price)))#backwardprint("苹果和橘子-->反向传播".center(50,"="))dall_price,dtax=mul_tax_layer2.backward(dprice)#4dapple_price,dorange_price=add_apple_orange_layer.backward(dall_price)#3dorange,dorange_num=mul_orange_layer2.backward(dorange_price)#2 dapple_price=dapple*dapple_numdapple,dapple_num=mul_apple_layer2.backward(dapple_price)#1print("苹果数量的导数{},苹果价格的导数{}\n 橘子数量的导数{},橘子价格的导数{}\n税率{},消费税的导数{}".format(dapple_num,dapple,dorange_num,dorange,dtax,dall_price))

Day7--误差反向传播相关推荐

  1. 机器学习入门(14)— 神经网络学习整体流程、误差反向传播代码实现、误差反向传播梯度确认、误差反向传播使用示例

    1. 神经网络学习整体流程 神经网络学习的步骤如下所示. 前提 神经网络中有合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为学习.神经网络的学习分为下面 4 个步骤. 步骤1(mini-ba ...

  2. 技术图文:如何利用 C# 实现 误差反向传播 学习规则?

    背景 我们在 如何利用 C# 对神经网络模型进行抽象? 中完成了神经网络的抽象结构: 三个接口:激活函数.有监督学习.无监督学习 三个抽象类:神经元.网络层.网络拓扑 我们在 如何利用 C# 实现神经 ...

  3. TensorFlow基础10-(误差反向传播算法以及实现多层神经网络)

    记录TensorFlow听课笔记 文章目录 记录TensorFlow听课笔记 一,误差反向传播算法 二,链式求导法则 三,隐含层有多个神经元的误差反向传播 四,激活函数 五,实现多层神经网络 一,误差 ...

  4. 【深度学习的数学】2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测(绘制出模型结果三维图展示效果)(梯度下降法+最小二乘法+激活函数sigmoid+误差反向传播法)

    文章目录 训练数据 数据示意 训练数据生成及绘制三维图像代码 训练数据三维图像 搭建神经网络结构 网络结构 利用梯度下降法和误差反向传播法计算损失函数损失值 代码 [灾难降临]代码出现严重问题,已将其 ...

  5. 深度学习入门|第5章 误差反向传播法(二)

    误差反向传播法 前言 此为本人学习<深度学习入门>的学习笔记 四.简单层的实现 本节将用 Python 实现前面的购买苹果的例子.这里,我们把要实现的计算图的乘法节点称为"乘法层 ...

  6. Day8_误差反向传播

    1.激活函数的实现 ReLU层 Relu函数 y=np.maximum(0,x) dy/dx=(1 if i >0 else 0 for i in x) 正向传播时的输入值小于等于0,则反向传播 ...

  7. 误差反向传播法(二)【神经网络以层的方式实现】

    我们来看激活函数层的实现,对于激活函数,大家初学神经网络的时候就经常听到,准确来说是在接触感知机的时候熟悉的,它是进入神经网络大门的钥匙,是现代神经网络快速发展的源头. ReLU层(Rectified ...

  8. 误差反向传播法(一)【计算图】

    在求损失函数关于权重参数的梯度的时候,使用数值微分在上一篇的最后有提到,很占CPU和耗时,所以一般都使用高效的误差反向传播法. 数值微分的作用一般就是用来检验误差反向传播法是否正确,因为数值微分比较简 ...

  9. 深度学习入门笔记(六):误差反向传播算法

    专栏--深度学习入门笔记 推荐文章 深度学习入门笔记(一):机器学习基础 深度学习入门笔记(二):神经网络基础 深度学习入门笔记(三):感知机 深度学习入门笔记(四):神经网络 深度学习入门笔记(五) ...

  10. 深度学习 --- BP算法详解(误差反向传播算法)

    本节开始深度学习的第一个算法BP算法,本打算第一个算法为单层感知器,但是感觉太简单了,不懂得找本书看看就会了,这里简要的介绍一下单层感知器: 图中可以看到,单层感知器很简单,其实本质上他就是线性分类器 ...

最新文章

  1. placeholder在不同浏览器下的表现及兼容方法
  2. 小技巧——让光驱符号定位在硬盘分区之后
  3. python+requests实现接口测试 - get与post请求使用
  4. 原生JavaScript实战之搜索框筛选功能
  5. Python轻量级IDE推荐 -- Jupyter QTConosle
  6. css怎样使弹跳的小球旋转,如何使用纯CSS实现小球跳跃台阶的动画效果(附源码)...
  7. python排序-堆排序
  8. 2120: 数颜色(带修莫队)
  9. 苹果电脑程序坞不见了?怎样隐藏与显示电脑Dock栏
  10. 魅族mx4pro刷linux,魅族MX4 Pro刷recovery教程_魅族MX4 Pro第三方recovery下载
  11. mac根目录无法新建文件夹
  12. 没有自制力的人,有什么资格谈努力?
  13. java考勤表导出_Sql通过存储过程生成全年日历考勤表数据
  14. oracle 18c ad登陆,Oracle 18c PSU
  15. Python的excel操作——PasteSpecial实现选择性粘贴自动化
  16. Java基于springboot+vue的流浪动物救助收养平台 nodejs 前后端分离
  17. 程序人生--2003年(20)
  18. 霍尔开关在电子烟中的应用
  19. MySQL之where查询
  20. AD中原理图和PCB的交互

热门文章

  1. 尝试一种新的生命状态
  2. 华为P50E全方位曝光:延续P50设计 换装骁龙778G 4G芯片
  3. “我没搞懂元宇宙,但一天能赚9w块”
  4. 特斯拉柏林超级工厂最终环保审批结果有望周五揭晓
  5. 我混了大半辈子,忽然成了拆二代
  6. iPhone13最新外观售价曝光:好看还便宜
  7. 中国联通董事李福申辞任
  8. 荣耀50样张公布:直出1亿像素 实际效果更出色
  9. 库克:明天将宣布重大消息 但不是新产品
  10. 荣耀V40屏幕素质得到“认证”:120Hz高刷屏没跑了