当前位置: 首页 > news >正文

深度学习-07-反向传播的自动化

深度学习-07-反向传播的自动化


本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动,也是鼓励更多优秀作品问世。

当前笔记内容主要为:步骤7 反向传播的自动化 章节的相关理解。

书籍总共分为5个阶段,每个阶段分很多步骤,最终是一步一步实现一个深度学习框架。例如前两个阶段为:

第 1 阶段共包括 10 个步骤 。 在这个阶段,将创建自动微分的机制
第 2 阶段,从步骤11-24,该阶段的主要目标是扩展当前的 DeZero ,使它能够执行更复杂的计算 ,使它能 够处理接收多个输入的函数和返回多个输出的函数


1.为反向传播的自动化创造条件

之前我们在实现反向传播的时候,我们是手动编写进行反向传播计算的代码,这意味着我们每次都要编写这些代码。例如下面的:

    A = Square()
    B = Exp()
    C = Square()

    x = Variable(np.array(0.5))
    a = A(x)
    b = B(a)
    y = C(b)

    y.grad = np.array(1.0)
    b.grad = C.backward(y.grad)
    a.grad = B.backward(b.grad)
    x.grad = A.backward(a.grad)
    print(x.grad)

如果计算图不一样,那么我们每次就需要白那些不一样的代码来计算反向传播。

图:不同计算图的例子。

那我们就开始思考如果自动化这块内容?书中讲解了一种机制:无论普通的计算流程(正向传播)中是什么样的计算,反向传播都能 自动进行 。这里引入一个概念:Define- by-Run。
Define-by-Run;是在深度学习中进行计算时 ,在计算之间建立"连接"的机 制 。 这种机制也称为动态计算图


计算图都是流水线式的计算 。 因此,只要以列表的形式记录函数的顺序,就可以通过反向回溯自动进行反向传播
    
    
在实现反向传播的自动化之前,我们先思考一下变量和函数之间的关系。解决方案主要从这里入手。我们需要考察变量和函数的关系并且用代码表示出来。

函数的变量包括"输入变量 "(input) 和"输出变量"(output)。函数是变量的 "父母" 如果没有父母,说明这个变量是用户的输入变量。

修改Variable 定义,函数和变量之间的"连接,让这个"连接"在执行普通计算(正向传播)的那一刻创建。

class Variable:def __init__(self, data):self.data = dataself.grad = Noneself.creator = Nonedef set_creator(self,func):self.creator = func

上面代码,定义了熟悉 creator 标识是那个函数。并且定义了set 方法,来进行变量与函数之间的关联。

修改 Function 定义:

class Function:def __call__(self, input):x = input.datay = self.forward(x)output = Variable(y)output.set_creator(self)  # 输出者保存创造者对象self.input = inputself.output = output  # 保存输出者。我是创造者的信息,这是动态建立 "连接"这 一 机制的核心return outputdef forward(self, x):raise NotImplementedError()  # 使用Function  这个方法forward 方法的人 , 这个方法应该通过继承采实现def backward(self, gy):raise NotImplementedError()


在函数执行时,就设置输出变量的 creator 为”自己“。并且将输出保存起来。

经过上面的操作后,变量和函数之间建立的联系,并且这两种联系的建立时代码执行过程中创建的。

有了连接,我们手动检查下,计算下反向遍历计算图  

    A = Square()B = Exp()C = Square()x = Variable(np.array(0.5))a = A(x)b = B(a)y = C(b)assert y.creator == Cassert y.creator.input == bassert y.creator.input.creator == Bassert y.creator.input.creator.input == aassert y.creator.input.creator.input.creator == Aassert y.creator.input.creator.input.creator.input == x

没有抛出异常,这意味着 assert 语句的所有条件都得到了满足。


2.尝试反向传播

利用上面的变量与函数之间的关系。进行反向传播计算。

先 y ---> b 

    y.grad = np.array(1.0)C = y.creator  # 获取函数b = C.input     # 获取函数的输入b.grad = C.backward(y.grad)    # 调用函数的backward 方法

然后  b ---> a
    
 

    B = b.creatorb = B.inputa.grad = B.backward(b.grad)

最后  a----> x 

    A = a.creatorx = A.inputx.grad = A.backward(a.grad)print(x.grad)


    
其实每一步的规律是:
1 获取函数 
2 获取函数的输入 
3 调用函数的 backward 方法


最后执行的结果为  
3.29744

3.增加backward 方法

前面这些反向传播的代码可以看山,它们有着相同的处理流程准确 来说,是从一个变量到前一个变量的反向传播逻辑相同。

修改Variable 类,增加一个新的方法-backward 


class Variable:def __init__(self, data):self.data = dataself.grad = Noneself.creator = Nonedef set_creator(self,func):self.creator = funcdef backward(self):f = self.creator  # 获取函数if f is not None:x = f.input # 获取函数的输入x.grad =f.backward(self.grad) # 调用函数的backward() 方法x.backward()  # 调用自己前面的那个变量的 backward()方法
4.项目代码
'''
step07.py
自动实现反向传播'''import numpy as npclass Variable:def __init__(self, data):self.data = dataself.grad = Noneself.creator = Nonedef set_creator(self,func):self.creator = funcdef backward(self):f = self.creator  # 获取函数if f is not None:x = f.input # 获取函数的输入x.grad =f.backward(self.grad) # 调用函数的backward() 方法x.backward()  # 调用自己前面的那个变量的 backward()方法class Function:def __call__(self, input):x = input.datay = self.forward(x)output = Variable(y)output.set_creator(self)  # 输出者保存创造者对象self.input = inputself.output = output  # 保存输出者。我是创造者的信息,这是动态建立 "连接"这 一 机制的核心return outputdef forward(self, x):raise NotImplementedError()  # 使用Function  这个方法forward 方法的人 , 这个方法应该通过继承采实现def backward(self, gy):raise NotImplementedError()class Square(Function):def forward(self, x):y = x ** 2return ydef backward(self, gy):x= self.input.datagx = 2 * x * gy     #方法的参数 gy 是 一个 ndarray 实例 , 它是从输出传播而来的导数 。return gxclass Exp(Function):def forward(self, x):y = np.exp(x)return ydef backward(self, gy):x = self.input.datagx = np.exp(x) * gyreturn gxif __name__ == '__main__':A = Square()B = Exp()C = Square()x = Variable(np.array(0.5))a = A(x)b = B(a)y = C(b)assert y.creator == Cassert y.creator.input == bassert y.creator.input.creator == Bassert y.creator.input.creator.input == aassert y.creator.input.creator.input.creator == Aassert y.creator.input.creator.input.creator.input == x# 反向传播y.grad = np.array(1.0)C = y.creator  # 获取函数b = C.input     # 获取函数的输入b.grad = C.backward(y.grad)    # 调用函数的backward 方法B = b.creatorb = B.inputa.grad = B.backward(b.grad)A = a.creatorx = A.inputx.grad = A.backward(a.grad)print(x.grad)# 自动反向传播x = Variable(np.array(0.5))a = A(x)b = B(a)y = C(b)y.grad = np.array(1.0)y.back()print(x.grad)
5.总结

经过此小节的代码丰富,目前我们可以执行自动反向传播计算。

相关文章:

深度学习-07-反向传播的自动化

深度学习-07-反向传播的自动化 本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动&#xf…...

四川景源畅信:抖音做直播有哪些人气品类?

随着互联网科技的飞速发展,抖音作为新兴的社交媒体平台,已经成为了人们日常生活中不可或缺的一部分。而在抖音平台上,直播功能更是吸引了大量的用户和观众。那么,在抖音上做直播有哪些人气品类呢?接下来,就让我们一起…...

闲鱼无货源-高级班,最全·最新·最干,紧贴热点 深度学习(17节课)

课程目录 1-1:闲鱼潜规则_1.mp4 2-2:闲鱼的基础操作-养号篇_1.mp4 3-3:闲鱼实战运营-选品篇(一)_1.mp4 4-4:闲鱼实战运营-选图视频篇_1.mp4 5-5:闲鱼实战运营-标题筒_1.mp4 6-6&#xff1…...

力扣 739. 每日温度

题目来源&#xff1a;https://leetcode.cn/problems/daily-temperatures/description/ C题解&#xff1a;使用单调栈。栈里存放元素的索引&#xff0c;只要拿到索引就可以找到元素。 class Solution { public:vector<int> dailyTemperatures(vector<int>& tem…...

工业网关有效解决企业在数据采集、传输和整合方面的痛点问题-天拓四方

一、企业背景概述 随着信息技术的飞速发展&#xff0c;工业互联网已成为推动制造业转型升级的关键力量。在众多工业企业中&#xff0c;某公司凭借其深厚的技术积淀和广阔的市场布局&#xff0c;成为行业内的佼佼者。然而&#xff0c;在数字化转型的道路上&#xff0c;该公司也…...

金融壹账通的“新机遇” 用科技赋能助力金融机构做大做强“五篇大文章

金融强国、做好金融“五篇大文章”、发展新质生产力&#xff0c;正成为引导国内金融行业高质量发展的重要方向。 今年以来&#xff0c;越来越多银行保险机构为了做好金融“五篇大文章”&#xff0c;一面通过自主研发新科技&#xff0c;满足业务数字化需求&#xff0c;一面则积…...

Day 42 LVS四层负载均衡

一&#xff1a;负载均衡简介 1.集群是什么 ​ 集群&#xff08;cluster&#xff09;技术是一种较新的技术&#xff0c;通过集群技术&#xff0c;可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益&#xff0c;其任务调度则是集群系统中的核心技术 …...

【源码】源码物品销售系统多种支付接口出售源码轻松赚钱

源码物品销售系统&#xff0c;多种支付接口&#xff0c;出售源码轻松赚钱。一款基于phpmysql开发的内容付费管理系统。系统支持多种收费方式&#xff0c;免签收款&#xff0c;三级分销&#xff0c;实名认证&#xff0c; 用户投稿/奖励&#xff0c;自动升级&#xff0c;佣金提现…...

图像操作的基石Numpy

OpenCV中用到的矩阵都要转换成Numpy数组 Numpy是一个经高度优化的Python数值库 创建矩阵 检索与赋值[y,x] 获取子数组[:,:] 一 创建数组array() anp.array([2,3,4]) cnp.array([1.0,2.0],[3.0,4.0]]) import numpy as npanp.array([1,2,3])bnp.array([[1,2,3],[4,5,6]])pr…...

如何利用exceljs将data数据导出表格实现日期去重,同时保留对应日期的每一列数据

const data [{ deviceId: 1, name: "B相电压", signalTypeId: 1, ts: "2024-05-13 12:10:06", unit: "kV", 1: 39.37936, value:39.37936, },{ deviceId: 1, name: "A相电压", signalTypeId: 2, ts: "2024-05-13 12:11:06"…...

[C#]使用C#部署yolov8-seg的实例分割的tensorrt模型

【测试通过环境】 win10 x64 vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super 版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll&#xff0c;TensorRtExtern源码地址&#xff1a;TensorRT-CShar…...

写个删除obj文件夹、bin文件夹的小工具

每次编译代码成功后都会生成obj/bin等文件夹。因此想清理这些文件夹&#xff0c;无奈工程数量较多&#xff0c;每个都要手动去删除比较累。就想到用代码写个小工具删除&#xff0c;当然也可以利用bat批处理删除。 using System; using System.Collections.Generic; using Syst…...

【多目标跟踪】《FlowMOT: 3D Multi-Object Tracking by Scene Flow Association》论文阅读笔记

0.论文 论文地址链接:https://arxiv.org/pdf/2012.07541v1 通过流的方式跟踪是一个比较新颖的点,所以这里比较关注运动跟踪,是如果做到流的跟踪来预测目标的位置以及ID绑定的。 FlowMOT的框架结构如下所示,本中会主要关注下运动跟踪、数据关联、ID分配、新生/消亡…...

python长方形周长面积 2024年3月青少年编程电子学会python编程等级考试二级真题解析

目录 python长方形周长面积 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python长方形周长面积 2024年3月 python编程等级考试级编程题 一、…...

C#WPF数字大屏项目实战02--主窗体布局

1、主窗体起始属性 设置有关属性如下&#xff1a; WindowStyle"None"-》无边框 AllowsTransparency"True" -》允许透明 WindowStartupLocation"CenterScreen"-》启动时位于屏幕中间 FontFamily"Microsoft YaHei"-》字体微软雅黑 …...

【STM32】STM32F103C6T6标准外设库

1、标准外设库获取 第一步&#xff0c;首先获取标准外设库&#xff0c;可以从官网进行下载。 https://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.html 根据自己的型号选择不同的系列&#xff0c;我这里选择是STM32F1系列 下载最新版本V3.6&a…...

【学习笔记】Windows GDI绘图(十一)Graphics详解(下)

文章目录 Graphics的方法Graphics.FromImageSetClip设置裁切区域IntersectClip更新为相交裁切区域TranslateClip平移裁切区域IsVisible判断点或矩形是否在裁切区域内MeasureCharacterRanges测量字符区域MeasureString测量文本大小MultiplyTransform矩阵变换 Graphics的方法 Gr…...

win10环境下nodejs安装过程

打开 https://nodejs.org/en/官网下载node.js 2.下载完成后的安装文件为node-v16.16.0-x64.msi&#xff0c;双击进行安装即可。 3.一直默认安装&#xff0c;记得可以更改安装路径 4.其他不用打勾&#xff0c;一直next&#xff0c;安装完成即可。 5.安装完成后&#xff0c;wi…...

亚信安慧AntDB:卓越的拓展性和灵活性

在当今这个信息爆炸的时代&#xff0c;企业对数据处理的需求不断增长&#xff0c;传统的数据库系统往往难以应对海量数据的存储和处理挑战。然而&#xff0c;随着亚信安慧AntDB的出现&#xff0c;解决这一难题的曙光终于出现在眼前。AntDB不仅仅具备了高吞吐、高并发、高性能的…...

【计算机毕设】基于SpringBoot的中小企业设备管理系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 在中小企业中&#xff0c;设备管理是确保生产和运营效率的重要环节。传统的设备管理通常依赖于手工记录和人工管理&#xff0c;容易导致数据不准确、…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...