【一起撸个DL框架】3 前向传播

news2025/1/12 22:56:49

CSDN个人主页:清风莫追
欢迎关注本专栏:《一起撸个DL框架》


文章目录

  • 3 前向传播🥝
    • 3.1 前情提要
    • 3.2 前向传播:递归的forward方法
    • 3.3 再添乘法节点:搭建函数y=2x+1
    • 3.4 小结

3 前向传播🥝

3.1 前情提要

上一篇:【一起撸个DL框架】2 节点与计算图的搭建

在上一节中,我们定义了加法节点和变量节点类,搭建计算图并实现了加法功能。但还有一个小问题,那就是节点类的定义中,只有父节点有值时,才能调用compute()方法计算本节点的值。而当存在多个节点串联时,就无法直接调用结果节点的compute()方法。因此,这一节我们将采用递归来解决这个问题。

在这里插入图片描述
图1:串联的两个加法节点

3.2 前向传播:递归的forward方法

我们只需要修改Node类,在其中添加一个forword()方法。当父节点的值为空时,递归地调用forward()计算节点的值,然后再调用compute()计算本节点的值。

class Node:
    def __init__(self, parent1=None, parent2=None) -> None:
        self.parent1 = parent1
        self.parent2 = parent2
        self.value = None
    def set_value(self, value):
        self.value = value
    def compute(self):
        pass
    def forward(self):
        for parent in [self.parent1, self.parent2]:
            if parent.value is None:
                parent.forward()
        self.compute()
        return self.value

然后,我们就可以使用修改过的节点类,搭建出图1中的计算图,并计算节点add2的值。

if __name__ == '__main__':

    # 搭建计算图
    x1 = Varrible()
    x2 = Varrible()
    add1 = Add(x1, x2)
    x3 = Varrible()
    add2 = Add(add1, x3)
    
    # 输入
    x1.set_value(int(input('请输入x1:')))
    x2.set_value(int(input('请输入x2:')))
    x3.set_value(int(input('请输入x3:')))

    # 前向传播
    y = add2.forward()
    print(y)

运行代码效果如下:

请输入x1:1
请输入x2:2
请输入x3:3
6

3.3 再添乘法节点:搭建函数y=2x+1

函数 y = 2 x + 1 y=2x+1 y=2x+1的计算图如图2所示,与图1很相似,只是其中一个加法节点换成了乘法节点。但不同之处是,在函数 y = 2 x + 1 y=2x+1 y=2x+1的计算图中,只有x一个自变量,其余变量节点称为参数

在这里插入图片描述
图2:函数y=2x+1的计算图

乘法节点类的实现与加法节点差不多,如下所示:

class Mul(Node):
    def __init__(self, parent1=None, parent2=None) -> None:
        super().__init__(parent1, parent2)
    def compute(self):
        self.value = self.parent1.value * self.parent2.value

下面是图2中计算图的搭建:

if __name__ == '__main__':

    # 搭建计算图
    w = Varrible()
    x = Varrible()
    mul = Mul(w, x)
    b = Varrible()
    add = Add(mul, b)
    
    # 输入
    w.set_value(2)
    b.set_value(1)
    x.set_value(int(input('请输入x:')))

    # 前向传播
    y = add.forward()
    print(y)
请输入x:2
5

3.4 小结

这一节的内容比较简单,我们用递归实现了前向传播,并搭建了一个一次函数: y = 2 x + 1 y=2x+1 y=2x+1


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

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

相关文章

vue - 实现对div的拖动功能

实现对div的拖动功能,需要先要知道以下的一些原生事件和方法; 1,事件: 方法描述onmousedown鼠标按钮被按下onmousemove鼠标被移动onmouseup鼠标按键被松开 2,方法: 方法描述event.clientX返回当事件被触发时鼠标指针相对于浏览…

基于elementplus 实现多级表格 最后一级展示图片

想要实现的效果 总共四级 前三级是表格 第四级使用图片展示; 看了一下官网 计划使用官网的树形结构, 但是发现并不能满足最后一个是图片形式的展示 最后利用了表格的expand; 在过程中主要需要解决的问题有:vue3 递归使用组件&am…

JavaScript题解2652.倍数求和|容斥原理

解题思路 在JavaScript中计算7/3*3,结果是7,而不是6。这是因为JavaScript中除法运算符(/)得到的结果是一个浮点数,而不是一个整数。 具体来说,7/3得到的结果是2.3333…,然后再乘以3得到7.0000…

辞了外包,上岸字节我落泪了,400多个日夜没人知道我付出了多少....

前言: 没有绝对的天才,只有持续不断的付出。对于我们每一个平凡人来说,改变命运只能依靠努力幸运,但如果你不够幸运,那就只能拉高努力的占比。 2023年3月,我有幸成为了字节跳动的一名自动化测试工程师&am…

nacos搭建

1、查询对应的nacos版本 在pom.xml文件中,按住ctrl单击 spring-cloud-alibaba-dependencies 跳转到对应的页面,搜索nacos 2、下载软件nacos 官网:https://nacos.io/zh-cn/ 地址 https://github.com/alibaba/nacos/releases 这里我们根据我…

【架构】如何在微服务下保证事务的一致性

文章目录 背景一、事务的介绍1.1 事务1.1.1 事务的产生1.1.2 事务的概念1.1.3 事务的特性1.1.4 Mysql隔离级别1.1.5 启动事务 1.2 本地事务1.2.1 本地事务定义1.2.2 本地事务的缺点 二、分布式事务定义三、分布式事务-强一致性解决方案3.1 二阶段提交协议3.2 三阶段提交协议 四…

centos7 nbd 挂在qcow2或qcow,raw,虚机镜像,virsh,virt,使用qemu-nbd挂载qcow2镜像文件

[rootlocalhost linux-3.10.63]# cat ../../../readme https://blog.51cto.com/mshxuyi/5857760 https://blog.csdn.net/weixin_42097108/article/details/111414501 错误解决 1、nbd 模块未安装 登录后复制 [rootlocalhost ~]# modprobe nbd modprobe: FATAL…

ElasticJob-Lite 3.x 集成springBoot 实战 (一次性作业、定时作业)

文章目录 前言ElasticJob-Lite 3.x 集成springBoot 实战 (一次性作业、定时作业)1. ElasticJob简介2. ElasticJob-Lite 是什么3. 功能列表4. 所需依赖包5. 定时作业配置5.1. 作业:5.2. yml配置:5.3. 测试 6. 一次性任务配置、并手动触发6.1. 作业:6.2. yml配置:6.3. 测试 7. 其…

洞见数字时代的创新原力,数云原力大会暨2023TECH第五届数字中国技术年会开幕

4月25日,神州控股、神州信息、神州数码集团共同主办的数云原力大会暨2023TECH第五届数字中国技术年会开幕。开幕式上,数百位投身并关注数字技术、数字产业发展的学者、技术专家、从业者、行业用户齐聚一堂,围绕云原生、数字原生、大数据、金融…

2.龙芯2k1000 linux3.10内核编译过程

龙芯2k1000 linux3.10内核编译过程 文章目录 龙芯2k1000 linux3.10内核编译过程(一)、在Ubuntu环境下载并配置交叉编译链(二)、下载linux3.10内核源码(三)、使用menuconfig配置内核(四&#xff…

【react从入门到精通】深入理解react生命周期这一篇就够了

文章目录 前言React的生命周期是什么React v16.0前的生命周期组件初始化(initialization)阶段组件挂载(Mounting)阶段组件更新(update)阶段组件销毁阶段 React v16.4 的生命周期总结写在最后 前言 在上一篇文章《react入门这一篇就够了》中我们已经掌握了React的基本知识。通过…

XXE原理利用防御

XXE原理利用防御 一、XML定义 1、定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 2、原因 应用程序解析XML时,没有过滤外部实体的加载&#xff0…

多用户商城平台开发需要注意哪些问题?

电子商务的快速发展,越来越多的企业选择借助第三方商城软件开设自己的多用户商城平台,以此来帮助他们增加销售额和提高品牌知名度,如目前市面上常见的shop、shopnc等第三方商城软件。但是,多用户商城平台的开发并不是一件容易的事…

QFIELD-GIS工具版如何编辑数据

一、 简介 在现场进行GIS数据对比、采集、编辑是移动GIS App的一项非常实用的功能。能够使用户更加及时准确的收集到第一手资料,并在现场第一时间进行编辑和完善。同时配合遥感、GPS或移动设备自带各类传感器,再辅助以其它矢量参考数据可以对已有成果…

如何利用社交媒体来做Etsy店铺推广?

利用社交媒体是 Etsy 店铺推广的重要一环。通过创作优秀的社交媒体内容、定期发布内容、与关注者互动和利用广告,你可以吸引更多的潜在客户,增加你的店铺销售量和品牌影响力。以下是详细说明如何利用社交媒体来做店铺推广: 选择适合的社交媒体…

FinClip 现已支持云开发

在开发一个小程序时,除了考虑界面功能逻辑外,还需要后端的数据支持,开发者需要提前考虑服务器、存储和数据库等相关需求的支持能力,此外还可能需要花费时间精力在部署应用、和依赖服务的建设上。 因此,腾讯小程序为了实…

NetMQ | 实现TCP的发布订阅模式

NetMQ | 实现TCP的发布订阅模式 文章目录 NetMQ | 实现TCP的发布订阅模式前言什么是发布订阅模式?实现步骤步骤1:创建Publisher和Subscriber步骤2:绑定和连接步骤3:添加订阅步骤4:发布消息步骤5:接收消息 示…

构建一体化数字营销平台,助力医药企业实现销售转化能级大幅跃迁 | 案例研究

今日分享的案例企业成立于1994年,主要从事心血管、消化领域的药品生产、加工、分装和销售,其中心血管相关药品广泛畅销至世界很多个国家。目前,该医药公司销售网络遍及全国80余个城市,以专业人员组成的营业队伍,致力于…

【Linux系统安装Python3 --- 思路清晰的五大步】

水善利万物而不争,处众人之所恶,故几于道💦 目录 一、检查Python版本 二、下载源码包 三、解压编译源码 四、安装Python 五、调整系统默认Python指向 一、检查Python版本 1.直接进入python命令行查看python版本 python 2.列出系统上所…

[Android 模块化配置实践] Java + Gradle7配置模块化实践记录

文章目录 1.项目配置及环境2.项目工程结构3.Project下的系列设置自定义config.gradlesetting.gradlebuild.gradle(:project) 添加modulemodule_common下的build.gradle配置遇到的报错一遇到的报错二 applicationId问题 module_xxx下的build.gradle示例 由于目前刚开始学习模块化…