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

这篇具有很好参考价值的文章主要介绍了【一起撸个DL框架】2 节点与计算图的搭建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • CSDN个人主页:清风莫追
  • 欢迎关注本专栏:《一起撸个DL框架》
  • GitHub获取源码:https://github.com/flying-forever/OurDL
  • blibli视频合集:https://space.bilibili.com/3493285974772098/channel/series

2 节点与计算图的搭建 🍒

2.1 简介

上一篇:【一起撸个DL框架】1 绪论

这一节将动手搭建一个简单的“计算图”,并在其上进行计算。

计算图这个术语大家可能感到陌生,它是图论中“图”的一种,由节点有向边组成,用来表示数据的流动。计算时则根据变量节点的输入得到输出。

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

2.2 设计节点类

我们将定义一个抽象的节点类。计算图中有两种节点,一种是“变量节点”,是计算图接受外部输入的地方,如上图中x1、x2节点;另一种是“计算节点”,从父节点获取输入,并进行某种运算后得到本节点的值,运算过程与具体的节点有关,如上图中add结点。所有的节点都将从抽象的节点类中派生得到。

(你当然也可以独立地实现每个节点类。但在抽象的节点类实现各种节点共有的性质,比如每个节点都会有自身的值、会有父节点,这样可以减少一些冗余的代码。)

我们将抽象的节点类命名为Node,那么Node类中应该有哪些成员呢?在搭建计算图时,需要将新建立的节点与之前的节点进行连接,因此可以有一个__init__()方法;变量节点需要接受外部输入,可以有个set_value()方法;计算节点需要知道自身具体的计算过程,可以有个compute()方法。那么,Node类的大致结构如下:

(这里为了简化设计,我们假定计算图中的每个节点都至多拥有两个父节点。即使是3个数相加,也可以拆解成两次2个数相加的运算。)

class Node:
    def __init__(self, parent1=None, parent2=None) -> None:
    	pass
    def set_value(self, value):
		pass
    def compute(self):
    	pass

接着,我们就可以通过继承Node类,实现各种具体的节点。比如“变量节点类(Varrible)”和“加法节点类(Add)”。其中变量节点什么也不用做,只需要原样继承Node类就好了。那么我可以直接将Node类作为变量节点吗?当然可以!这里主打的就是一个整整齐齐(继承关系更加统一和清晰)。同时,变量节点没有父节点,而是从外部接受输入,因此父节点直接初始化为None就好。

加法节点还需要具体实现计算本节点值的compute()方法。

class Varrible(Node):
    def __init__(self) -> None:
        super().__init__()

class Add(Node):
    def __init__(self, parent1=None, parent2=None) -> None:
        super().__init__(parent1, parent2)
    def compute(self):
        pass

2.3 节点类的具体实现

实现代码如下:

(在Node类中定义copute()有什么意义呢,在具体的计算节点类中再定义不就可以了吗?没错,但这里我们的目的主要是作为一个提醒:在计算节点中不用忘记了实现具体的计算方法,同时保证统一的方法名,不要在加法节点中是compute,在以后的乘法节点中又变成了calculate)

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

class Varrible(Node):
    def __init__(self) -> None:
        super().__init__()

class Add(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.4 搭建计算图进行计算

完成节点类的定义之后,利用计算图进行计算的过程大致是个三步走的过程:

  • 1 搭建计算图。节点本身是孤立的,将节点连接起来才是具有逻辑结构的计算图。
  • 2 输入。
  • 3 计算结果节点的值。
if __name__ == '__main__':

    # 搭建计算图
    x1 = Varrible()
    x2 = Varrible()
    add = Add(x1, x2)  # 结果节点
    
    # 输入
    x1.set_value(int(input('请输入x1:')))
    x2.set_value(int(input('请输入x2:')))

    # 进行前向计算
    add.compute()  # 计算add节点的值并保存在该节点的value属性中
    print(add.value)

运行结果:

请输入x1:3
请输入x2:4
7

2.5 小结

本节以一个不到40行代码的简单例子,向搭建介绍了计算图的搭建与运算的大致过程,实现了将两个变量x1、x2作为输入,计算它们的和add的功能。

有同学可能就疑惑了,40行的简单例子?那它和我这四行代码有什么区别吗?嗯,从实现的功能上来看,几乎可以说是没有区别。不过,这是为了给后面的内容做铺垫的啦!我们想要实现一个简单的框架,图的结构可以比较灵活的进行调整,而一个函数def add(x1, x2)直接就写定了。

def add(x1, x2):
    return x1 + x2
y = add(int(input('请输入x1:')), int(input('请输入x2:')))
print(y)

本节实现的计算图只有三个节点,后面我们将继续对代码进行扩展,以支撑更加复杂的计算图的实现,一步步前进,最终尝试用我们的框架去实现一些简单的深度学习任务。

2.6 题外话——节点存储的值

我们与实际深度学习框架相比,虽然都是基于计算图的思想,但基本的实现上却有所区别。因为多个节点的运算在实现上,可以通过矩阵乘法来打包进行,效率更高,代码编写也更简单,但也更加抽象和难以理解。

小批量梯度下降法”(MBGD)是一个基本的神经网络优化算法,每次用一小批样本来更新网络的参数,而不是一个样本(SGD),也不是所有样本(BGD)。框架通常还将“批机制”集成到了计算图中,可以在计算图的一次运算中批量处理多个样本,于是计算图需要再加一个维度。而对于三维的图像输入数据(高,宽,通道数),图的节点中存储的将是四维的张量

注:有时我们谈到SGD,其实指的是MBGD。

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

我主要参考的书籍是张觉非和陈震的《用Python实现深度学习框架》,书中实现的MatrixSlow框架为了概念的清晰,将批机制放在了计算图之外,以将它与计算图在原理上区分开。在MatixSlow的实现中,每个节点存储的值都是二维矩阵

然而目前我们的实现中,每个节点存储的都是单个数值,也就是“标量”。这将导致更糟糕的计算效率,但好处是可以屏蔽之后反向传播时的矩阵乘法运算的求导问题。我感觉这样在概念上对深度学习框架的理解可能会更简单一些。


下一篇:【一起撸个DL框架】3 前向传播文章来源地址https://www.toymoban.com/news/detail-455966.html

到了这里,关于【一起撸个DL框架】2 节点与计算图的搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【一起撸的DL框架】5 实现:自适应线性单元

    CSDN个人主页:清风莫追 欢迎关注本专栏:《一起撸个DL框架》 GitHub获取源码:https://github.com/flying-forever/OurDL blibli视频合集:https://space.bilibili.com/3493285974772098/channel/series 上一篇:【一起撸个DL框架】4 反向传播求梯度 上一节我们实现了计算图的反向传播,可以求结果节点关于

    2024年02月02日
    浏览(29)
  • 【一起学Rust | 框架篇 | Tauri2.0框架】Tauri2.0环境搭建与项目创建

    Tauri在Rust圈内成名已久,凭借Rust的可靠性,使用系统原生的Webview构建更小的App 以及开发人员可以灵活的使用各种前端框架而一战成名。 然而,这款年轻的框架却有着大量的问题待解决,在这种情况下,他竟然还出了2.0,想要支持 安卓 和 苹果端 ,在我看来步子还是跨的挺

    2024年02月20日
    浏览(43)
  • 从零构建深度学习推理框架-7 计算图的表达式

    表达式就是一个计算过程,类似于如下: 用图形来表达就是这样的。 但是在PNNX的表达式(Experssion Layer)中不是这个样子,而是以一种抽象得方式,替换掉输入张量改为@1,@2等等 所以上面的计算图也就变成了 我们是希望把这个抽象的表达式变回到一个方便后端执行的计算过程

    2024年02月13日
    浏览(26)
  • 云计算平台OPENSTACK-IAAS服务搭建-双节点【详解】

    目录:导读 OPENSTACK云平台基础架构 步骤 1.搭建虚拟机: 2.IAAS搭建流程第一步 基础搭建: 本来要搭建4节点,控制节点,网路节点,计算节点,存储节点,但是。。。。。此次搭建使用双节点测试,更多集群部署请自行增加即可。 步骤 openstack云平台基础架构 1.搭建虚拟机:

    2024年02月03日
    浏览(46)
  • Gradio快速搭建ML/DL Web端服务

    当我们训练好了某个模型并且效果还不错时,最先想到的应该是 部署 .部署又可以分为线上Web服务和边缘模块上;为了汇报的时候往往还是选择线上部署,毕竟盒子部署好了还得配置相应的硬件输入也不方便展示.在这个专栏之前尝试用 fastapi 搭建了Web服务,并且将一些算法模型部

    2024年02月11日
    浏览(35)
  • 杨校老师课堂之云计算私有云OpenStack框架快速搭建

    1.什么是OpenStack OpenStack是一系列开源软件项目的组合。 OpenStack是目前非常流行的开源云操作系统 OpenStack是基础设施资源的系统管理平台。 OpenStack对数据中心的计算、存储和网络资源进行统一管理。 OpenStack作为虚拟机、裸金属服务器和容器等的云基础架构和基础设施平台。

    2024年02月16日
    浏览(30)
  • 生信工作流框架搭建 | 04-nextflow与Slurm高性能计算

    本篇为biodoge《生信工作流框架搭建》系列笔记的第5篇,该系列将持续更新。 上回生信工作流框架搭建 | 03-nextflow与AWS批量计算为大家提供了nextflow上云的实用教程。虽然AWS批量计算技术含量较大,但毕竟在国内应用场景较少,下面将为大家介绍另一种更为常用的应用:阿里云

    2024年02月15日
    浏览(93)
  • 【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui

    本次内容接上回《rust原生跨平台GUI框架——iced》,最近突然涌现出多个Rust的UI框架,真实令人兴奋,同时也突出了Rust的勃然生机,我将尽量为大家介绍Rust领域的UI框架,带大家体验Rust领域的好玩意儿。 Frui是一个对开发者相当友好的UI框架,它使得开发者构建用户界面变得

    2024年02月01日
    浏览(32)
  • 数据结构学习记录——如何建立图(邻接矩阵、邻接表-图节点的结构、创建并初始化、插入变、完整图的建立)

    目录 邻接矩阵 图节点的结构 创建并初始化 插入边 完整的图的建立  邻接表 图节点的结构 创建并初始化 插入边  完整的图的建立  定义结构体GNode,其中包含以下成员变量: Nv:表示图中的顶点数。 Ne:表示图中的边数。 二维数组表示图的邻接矩阵。它的大小是MaxVertexN

    2024年02月06日
    浏览(36)
  • 一起学习云计算

    目录 前言 一、云计算是什么? 二、云计算的组成 三、交付模型 四、 云部署模式     随着经济社会的迅速发展,人们对于网络资源的要求量也越来越高,随之出现的一系列网络平台及服务也越来越多,对于云计算的出现提供了必然条件,以下是关于云计算的简单介绍。 提

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包