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

简介: 3 前向传播🥝3.1 前情提要上一篇:【一起撸个DL框架】2 节点与计算图的搭建

3 前向传播🥝

3.1 前情提要

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

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

2948636f553c458c88bf0bf91f20ff1e.png

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

49b1b0684af74bfa826c48664ee94a39.png

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

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  


相关文章
|
监控 Linux 数据安全/隐私保护
IPMI介绍
IPMI简要介绍
7932 0
|
7月前
|
机器学习/深度学习 传感器 人工智能
《告别单一智能:神经符号混合系统驱动推理能力的跨界融合》
神经符号混合系统融合了神经网络与符号推理的优势,旨在赋予智能体大模型媲美人类的推理能力。神经网络擅长从数据中学习特征,但决策过程缺乏可解释性;符号推理基于规则和逻辑,具有高度可解释性,却难以应对复杂不确定性。神经符号混合系统通过结合两者,不仅提升了知识表示、推理决策和泛化能力,还在自动驾驶、金融预测、科学研究、智能教育和工业制造等领域展现出广泛应用前景。尽管当前仍面临模块融合与成本等挑战,但其发展潜力巨大,有望推动人工智能迈向更高水平,助力解决更多复杂现实问题。
311 10
《告别单一智能:神经符号混合系统驱动推理能力的跨界融合》
|
机器学习/深度学习 算法 前端开发
基于Python深度学习的果蔬识别系统实现
果蔬识别系统,主要开发语言为Python,基于TensorFlow搭建ResNet卷积神经网络算法模型,通过对12种常见的果蔬('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜')图像数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django框架搭建Web网页端可视化操作界面,以下为项目实现介绍。
223 4
基于Python深度学习的果蔬识别系统实现
|
存储 数据处理 数据中心
1U和2U服务器应如何正确选择?各有什么优缺点?
标准机架式服务器以U为高度单位,1U和2U服务器因高度差异影响其内部空间和扩展能力。1U服务器体积小巧、性价比高但扩展性受限;2U服务器扩展性强、散热好、稳定性高,但托管费用较高。选择时需根据具体需求权衡。
476 6
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
域名解析 缓存 人工智能
Linux网络服务DNS详解(不要混日子,小心日子把你们混了)(一)
Linux网络服务DNS详解(不要混日子,小心日子把你们混了)(一)
1337 0
Linux网络服务DNS详解(不要混日子,小心日子把你们混了)(一)
|
JSON 数据可视化 前端开发
我学会了,用Echarts
Echarts**可视化工具**的强大,相信不少朋友都能感受到,它帮助我们更快地“搭建 ”我们想要的可视化图表应用。那么,它怎么知道我们需要什么样的图表?它又是如何工作的?在这篇文章里,我们一起来看看。
1087 0
我学会了,用Echarts
|
存储 分布式计算 Hadoop
hadoop-2.7.7 HA完全分布式集群部署详解
Hadoop NameNode官方开始支持HA集群默认是从2.0开始,之前的版本均是不支持NameNode HA的高可用的。
3646 1
当下最火的会员制商城商业模式及开发思路
今年的整个社交电商、云集上市对整个电商的重新定义和布局对很多有梦想的创业者有很多的感触。提及到会员制商城,相信很多人有很多个版本,但是今天我想跟大家分享的是全球最有名的“好市多超市会员制”的思路。一、好市多(Costco)超市商业模式概要:雷军称:有三家企业的范例对他创建小米影响深远,一家是同仁堂,一家是海底捞,而第三家则是好市多(Costco),那么好市多(Costco)具体是怎么操作的呢?Costco是美国一家著名商超,以贴近成本的低价格著称。
2784 0

热门文章

最新文章