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

 误差反向传播法

前言

此为本人学习《深度学习入门》的学习笔记

四、简单层的实现

本节将用 Python 实现前面的购买苹果的例子。这里,我们把要实现的计算图的乘法节点称为“乘法层”(MulLayer),加法节点称为“加法层”(AddLayer)。

1、乘法层的实现

层的实现中有两个共通的方法(接口)forward() 和backward()forward() 对应正向传播,backward() 对应反向传播。

实现乘法层。乘法层作为 MulLayer 类,其实现过程如下所示

 

class MulLayer:def __init__(self):self.x = Noneself.y = Nonedef forward(self, x, y):self.x = xself.y = yout = x * yreturn outdef backward(self, dout):dx = dout * self.y # 翻转x和ydy = dout * self.xreturn dx, dy

__init__() 中会初始化实例变量 x 和 y,它们用于保存正向传播时的输入值。forward() 接收 x 和 y 两个参数,将它们相乘后输出。backward() 将从上游传来的导数(dout)乘以正向传播的翻转值,然后传给下游。

使用 MulLayer 实现前面的购买苹果的例子(2 个苹果和消费税)。

 

        

                    图 5-16 购买 2 个苹果

使用这个乘法层的话,图 5-16 的正向传播可以像下面这样实现

 此外,关于各个变量的导数可由 backward() 求出。

调用 backward() 的顺序与调用 forward() 的顺序相反。此外,要注意 backward() 的参数中需要输入“关于正向传播时的输出变量的导数”。比如,mul_apple_layer 乘法层在正向传播时会输出 apple_price,在反向传播时,则会将 apple_price 的导数 dapple_price 设为参数。

2、加法层的实现

class AddLayer:def __init__(self):passdef forward(self, x, y):out = x + yreturn outdef backward(self, dout):dx = dout * 1dy = dout * 1return dx, dy

加法层不需要特意进行初始化,所以 __init__() 中什么也不运行(pass 语句表示“什么也不运行”)。加法层的 forward() 接收 x 和 y 两个参数,将它们相加后输出。backward() 将上游传来的导数(dout)原封不动地传递给下游。

使用加法层和乘法层,实现图 5-17 所示的购买 2 个苹果和 3 个橘子的例子。

      

              图 5-17 购买 2 个苹果和 3 个橘子

用 Python 实现图 5-17 的计算图的过程如下所示

首先,生成必要的层,以合适的顺序调用正向传播的 forward() 方法。然后,用与正向传播相反的顺序调用反向传播的 backward() 方法,就可以求出想要的导数。

五、激活函数层的实现

将计算图的思路应用到神经网络中。把构成神经网络的层实现为一个类。先来实现激活函数的 ReLU 层和 Sigmoid 层。

1、ReLU层

激活函数 ReLU(Rectified Linear Unit)由下式(5.7)表示。

通过式(5.7),可以求出 y 关于 x 的导数,如式(5.8)所示。

在式(5.8)中,如果正向传播时的输入 x 大于 0,则反向传播会将上游的值原封不动地传给下游。反过来,如果正向传播时的 x 小于等于 0,则反向传播中传给下游的信号将停在此处。用计算图表示的话,如图 5-18 所示。

实现 ReLU 层。在神经网络的层的实现中,一般假定 forward() 和backward() 的参数是 NumPy 数组。

 

  图 5-18 ReLU 层的计算图

class Relu:def __init__(self):self.mask = Nonedef forward(self, x):self.mask = (x <= 0)out = x.copy()out[self.mask] = 0return outdef backward(self, dout):dout[self.mask] = 0dx = doutreturn dx

Relu 类有实例变量 mask。这个变量 mask 是由 True/False 构成的 NumPy 数组,它会把正向传播时的输入 x 的元素中小于等于 0 的地方保存为 True,其他地方(大于 0 的元素)保存为 False

 2、Sigmoid层

实现sigmoid函数,sigmoid函数由式(5.9)表示

用计算图表示式子(5.9)的话,则如图5-19所示

图 5-19 sigmoid 层的计算图(仅正向传播)

图 5-19 中,除了“×”和“+”节点外,还出现了新的“exp”和“/”节点。“exp”节点会进行 y = exp(x) 的计算,“/”节点会进行 y=\frac{1}{x} 的计算。

如图 5-19 所示,式(5.9)的计算由局部计算的传播构成。

下面我们就来进行图 5-19 的计算图的反向传播。这里,作为总结,我们来依次看一下反向传播的流程。

步骤 1

“/”节点表示 y=\frac{1}{x},它的导数可以解析性地表示为下式。

enter image description here

根据式(5.10),反向传播时,会将上游的值乘以 -y^2(正向传播的输出的平方乘以 -1 后的值)后,再传给下游。计算图如下所示。

{95%}

步骤 2

“+”节点将上游的值原封不动地传给下游。计算图如下所示。

{95%}

步骤 3

“exp”节点表示 y = exp(x),它的导数由下式表示。

\frac{\partial y}{\partial x}=\exp(x)\quad\quad\quad\quad\quad(5.11)

计算图中,上游的值乘以正向传播时的输出(这个例子中是 exp(-x))后,再传给下游。

{95%}

步骤 4

“×”节点将正向传播时的值翻转后做乘法运算。因此,这里要乘以 -1。

{95%}

图 5-20 Sigmoid 层的计算图

 

转载于:https://www.cnblogs.com/zyqy/p/10816953.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牡丹-曹州牡丹:曹州牡丹

ylbtech-牡丹-曹州牡丹&#xff1a;曹州牡丹菏泽牡丹&#xff0c;山东省菏泽市特产&#xff0c;中国国家地理标志产品。牡丹&#xff0c;原产中国西北部&#xff0c;秦岭和陕北山地多野生&#xff0c;栽培历史悠久&#xff0c;南北朝时已声成为观赏植物。菏泽&#xff0c;古称曹…

idea报错:Error: java: 错误: 不支持发行版本 5

我在测试类运行时&#xff0c;出现下述错误&#xff1a; 可能原因&#xff1a;java版本不一致项目编译配置使用的java版本不对 解决方案&#xff1a; 第一步&#xff1a;file---Project Structure-- Project&#xff08;两版本改为一致&#xff1a;第二、三个横框中数字都为11…

python网络爬虫基础day01

2019.5.13&#xff0c;今天在“小猿圈”跟着波波老师学习了爬虫开发的第一章和第二章&#xff0c;总结下今天学的知识&#xff1a; 爬虫基础介绍&#xff1a;   什么是爬虫&#xff1f;    - 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;然后让其去互联网上抓取数…

忘记mysql数据库连接密码

本次操作所有需要用到的密令行&#xff1a; bin>net stop mysql bin>mysqld --skip-grant-tables bin>mysql mysql>use mysql mysql>update user set passwordpassword("123456") where user"root"; mysql>flush privileges; mys…

Python 基础 函数

1&#xff1a;调用函数 eg&#xff1a;调用内置函数 abs() 求绝对值 2&#xff1a;定义函数 1&#xff1a;定义一个函数要使用 def 语句&#xff0c;依次写出函数名、括号、括号中的参数和冒号:&#xff0c;然后&#xff0c;在缩进块中编写函数体&#xff0c;函数的返回值用ret…

Springmvc跨服务器文件上传报403,409错误

报403错误 Tomcat默认只读模式&#xff0c;传图片会被拒绝 解决&#xff1a;找到 Tomcat 目录---conf下---web.xml&#xff0c;打开 加入 <init-param><param-name>readonly</param-name><param-value>false</param-value> </init-param&g…

单元测试——Winfrom

一、新建单元测试项目 二、单元测试可在Service或者Repository层分别创建 三、编写好代码后可运行单元测试 转载于:https://www.cnblogs.com/772933011qq/p/10863817.html

vue报错:dependencies were not found: * element-ui in ./src/main.js * element-ui/lib/theme-chalk/inde

报错信息 These dependencies were not found: * element-ui in ./src/main.js * element-ui/lib/theme-chalk/index.css in ./src/main.js 解决方案 1、 cmd进入命令行窗口&#xff0c;切入运行的项目文件夹下 2、输入 cnpm i element-ui -S(没有装淘宝镜像的使用 npm i…

Spring的配置与使用

一、Spring的组成 其中最核心的是Core Container核心容器 二、spring框架的作用&#xff1a; 对于我目前了解的spring框架&#xff0c;其中一个作用是用来降低程序间的耦合度的&#xff0c;也就是降低程序间的依耐性。 IOC&#xff1a;inversion of control 控制反转-->即将…

新增或编辑保存时出错后,页面无法再次编辑

新增或编辑保存时出错后&#xff0c;页面无法再次编辑&#xff0c;除非关闭新增或编辑弹窗&#xff0c;重新打开新增或编辑页面&#xff0c;否则无法编辑 &#xff0c;如下图&#xff1a; 解决方案 在新增方法之前定义loading参数&#xff0c;在调用后台服务之前先使用loading…

选择日期保存后日期变成前一天(avue date)

1、问题&#xff1a;选中日期&#xff0c;保存&#xff0c;日期变成前一天 {label: 生产日期,prop: esDate,type: date,}, 2、解决&#xff1a;&#xff08;avue的官方文档&#xff09; {label: 生产日期,prop: esDate,type: date,valueFormat: yyyy-MM-dd}, 只需要加 value…

v-region 地址组件无法回显问题(选择地址保存后,打开编辑,发现刚才选择的地址【省市县乡】信息消失,信息不回显)

(Avue) 1、问题 v-region 地址组件无法回显(选择地址保存后&#xff0c;打开编辑&#xff0c;发现刚才选择的地址【省市县乡】信息消失&#xff0c;信息不回显) 选择好省市县乡后&#xff0c;保存&#xff0c;再次编辑&#xff0c;发现如下&#xff1a; 2、解决方案&#xff…

JavaScript中一个对象数组按照另一个数组排序

JavaScript中一个对象数组按照另一个数组排序 需求&#xff1a;排序 const arr1 [33, 11, 55, 22, 66];const arr2 [{age: 55}, {age: 22}, {age: 11}, {age: 66}, {age: 33}]数组arr2中每项都是一个对象&#xff0c;对象中age属性 数组arr1中的项将arr2数组根据对象的age值…

oracle mysql 常用语句(查询表中某字段有几种类型,及每种类型有多少个数、插入多行、查询前几行)

亲测有效 1、&#xff08;1&#xff09;查询表中某字段有几种类型&#xff0c;及每种类型有多少个数 select DISTINCT name user_name,count(*) num from patient GROUP BY name &#xff08;2&#xff09;查询表中某字段类型共有几种 select count(distinct name) from pat…

SQL中多表查询:左连接、右连接、内连接、全连接、交叉连接

一、左连接&#xff0c;右连接&#xff0c;内连接关系 左连接&#xff1a;左表全部两个表交集&#xff08;①②&#xff09; 右连接&#xff1a;右表全部两个表交集&#xff08;③②&#xff09; 内连接&#xff1a;两个表交集&#xff08;②&#xff09; 二、结合具体例子看…

ORA-00972: identifier is too long问题解决

报错 解决&#xff1a; 查看你写的是否有中文 如果有中文&#xff0c;看是否有引号将中文引起来&#xff0c;用引号引起来后不报错

Alter操作(修改列名,修改列数据类型,增加列,删除列,增加列且设为主键及对默认值操作)

一、mysql &#xff08;增加列&#xff0c;删除列&#xff0c;修改列&#xff1b;增加&#xff0c;删除&#xff0c;修改列的默认值&#xff09; 增加列&#xff0c;删除列&#xff0c;修改列 1、修改列的数据类型 alter table patient modify column mood int2、修改列名 …

马蜂窝推荐系统容灾缓存服务的设计与实现

数据库突然断开连接、第三方接口迟迟不返回结果、高峰期网络发生抖动...... 当程序突发异常时&#xff0c;我们的应用可以告诉调用方或者用户「对不起&#xff0c;服务器出了点问题」&#xff1b;或者找到更好的方式&#xff0c;达到提升用户体验的目的。 一、背景 用户在马蜂窝…

Vivado Bit文件压缩

前言 Vivado编译生成的Bit文件太大&#xff0c;想要小一点该咋办呢&#xff1f;那么就需要给bit文件瘦身。 流程 直接在约束文件xdc中添加下述语句即可&#xff1a; set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] 未压缩前 压缩后 根据工程不同&#xff0c;还…

Mac安装webpack报错gyp ERR! configure error gyp ERR! stack Error: `gyp` failed with exit code: 1解决

安装webpack &#xff0c;报错提示 gyp ERR! configure error gyp ERR! stack Error: gyp failed with exit code: 1 gyp ERR! stack at ChildProcess.onCpExit (/usr/local/lib/node_modules/cnpm/node_modules/node-gyp/lib/configure.js:345:16) gyp ERR! stack a…