当前位置:首页 > 经验 >

编程符号什么意思(编程符号的含义及用法)

来源:原点资讯(www.yd166.com)时间:2022-11-18 01:03:22作者:YD166手机阅读>>

导读

在深度学习中,我们经常会学习和使用到各种框架,如Facebook的pytorchGoogle的TensorFlow亚马逊的MXNet等。这些框架编程分格主要可以分为三大类,命令式编程符号式编程混合式编程。这篇文章,我们就来介绍一下它们不同编程分格之间的特点。

编程符号什么意思,编程符号的含义及用法(1)

命令式编程

Python的编程分格就是典型的命令式(imperative program)编程,在深度学习框架中pytorch就是用的命令式编程,下面我们使用命令式编程来写一段代码

def add(a, b): return a b def fancy_func(a, b, c, d): e = add(a, b) f = add(c, d) g = add(e, f) return g fancy_func(1, 2, 3, 4)

在调用fancy_func函数运行e=add(a,b)代码时,Python需要调用add方法做加法运算然后将运算结果保存到变量e中,然后再依次运行f=add(c,d)g=add(e,f)代码。

通过上面的代码可以发现在调用fancy_func方法的时候,add函数被重复调用了3次,同时在调用add函数的时候,还需要开辟空间来存储e、f变量,即使后面没有使用到这些变量。因为我们不知道下面究竟会不会使用到这些变量,所以只有当fancy_func函数执行结束的时候,才会释放变量所占用的空间。

命令式编程的特点

  • 代码简洁明了,容易理解
  • 执行效率低,不方便优化代码
  • 可以获取中间结果,方便调试代码

编程符号什么意思,编程符号的含义及用法(2)

符号式编程

符号式编程(symbolic program)框架的代表就是TensorFlow,除此之外还有TheanoCaffe。符号式编程需要在计算过程完全被定义好之后才被执行,通常符号式编程会根据下面这三个步骤进行:

  1. 定义计算流程
  2. 将计算流程编译成可执行的程序
  3. 给定输入,调用编译好的程序执行

下面我们来看一段符号式编程分格的代码

A = Variable('A') B = Variable('B') C = B * A D = C Constant(1) # 编译函数 f = compile(D) d = f(A=np.ones(10), B=np.ones(10)*2)

在执行上面代码中的C=B∗A时,并不会触发真正的数值计算,它会生成一个计算图

编程符号什么意思,编程符号的含义及用法(3)

大部分的符号式编程都会有一个隐性或显性的编译步骤,只有编译之后的函数才能够调用,所以在上面的代码中只有最后一行才会触发数值计算。在编译的过程中,系统会自动对计算和内存做一些优化,而且符号式编程不会保存中间变量的结果,所以相对于命令式编程来说,符号式编程的计算效率和内存利用更高。除此之外,符号式编程可以将程序编译成一个与Python无关的函数,从而可以使程序在非Python环境下运行,避免Python解释器的性能问题

符号式编程的特点:

  • 执行效率高,代码不易看懂
  • 无法保存中间变量,不方便调试
  • 方便移植,可以跨平台和语言使用编译好的函数
  • 符号式编程不支持循环和选择结构
混合编程

大部分的深度学习框架都是在命令式编程和符号式编程二选一,要么选择便于调试和开发的命令式编程要么选择执行高效的符号式编程混合编程的目的就是命令式编程和符号式编程的长处,让开发者能够享受到命令式编程简洁特性同时能够享受到符号式编程的效率

MXNetgluon正是基于混合式编程的思想,用户可以使用纯命令式编程进行开发和调试当用户需在部署时需要产品级的性能时可以将大部分命令式编程程序转换为符号式编程运行

编程符号什么意思,编程符号的含义及用法(4)

计算性能比较

最后,我们通过MXNet框架来实现一段代码体验一下命令式编程和符号式编程之间的性能差距

from mxnet import nd,sym from mxnet.gluon import nn import time #创建一个容器用来定义网络结构 net = nn.HybridSequential() #定义一个三层全连接的网络结构 net.add(nn.Dense(256,activation="relu"), nn.Dense(128,activation="relu"), nn.Dense(2)) #初始化网络参数 net.initialize() #创建一个网络的输出值 x = nd.random.normal(shape=(1,512)) def eval_fun(net,x): start_time = time.time() for i in range(1000): _ = net(x) #等待所有计算完成 nd.waitall() #统计程序运行时间 return time.time() - start_time print("imperative programe consume time:{:.4f}".format(eval_fun(net,x))) #将程序转变为符号式编程 net.hybridize() print("symbolic programe consume time:{:.4f}".format(eval_fun(net,x))) """ imperative programe consume time:0.2620 symbolic programe consume time:0.1610 """

通过上面程序可以发现,上面程序仅仅只是测试了前向传播符号式编程的运行速度要比命令式编程快0.1s左右,而且上面只是一个三层的网络也仅仅只是迭代了1000次,实际应用的网络结构会比这个复杂的多,当数据比较多时迭代次数也会远远大于1000,实际运行能节省的时间远不止这么一点

栏目热文

逻辑符号是啥(逻辑符号大全及含义)

逻辑符号是啥(逻辑符号大全及含义)

一、集合符号1、集合与元素之间符号 “∈” 表示“属于”;符号 “∉” 表示 “不属于”,符号 “P(x)” 表示“元素...

2022-11-18 00:23:40查看全文 >>

控制字是数据还是命令(控制字与状态字的区别)

控制字是数据还是命令(控制字与状态字的区别)

“EtherCAT是分布式高性能I/O系统的理想选择,那国内有没有一款经过市场验证的EtherCAT远程I/O模块呢?今...

2022-11-18 00:22:44查看全文 >>

编程数字符号的意思(编程里的数字代表什么)

编程数字符号的意思(编程里的数字代表什么)

符号表可以为存储器地址或常量指定的符号名称,在进行程序编写前必须要做的工作,为各地址和变量命名,就像一个班级里每个人都有...

2022-11-18 00:58:45查看全文 >>

字指令与位指令的区别(怎么区分字节操作指令和16位指令)

字指令与位指令的区别(怎么区分字节操作指令和16位指令)

学习嵌入式开发,那当然会涉及到ARM状态和THUMB状态,很多初学者对这两个状态一直不是很理解,都是一直处于迷茫中,今天...

2022-11-18 01:11:12查看全文 >>

逻辑符号怎么来的(逻辑符号查看图解)

逻辑符号怎么来的(逻辑符号查看图解)

概念化的认知中,符号的使用主要是刻画概念间的关系。从现状来说,这种刻画是由逻辑、数学的应用带来的。从历史的角度,逻辑与数...

2022-11-18 00:38:12查看全文 >>

位逻辑指令是什么意思(位逻辑指令有什么意义)

位逻辑指令是什么意思(位逻辑指令有什么意义)

西门子S7-1500 PLC与博途应用(基础篇)授课老师:课时内容课时介绍第0课.课程宣传片详细讲述开始本课程的由来,本...

2022-11-18 00:22:43查看全文 >>

字形输出码的作用(点阵码与字节关系)

字形输出码的作用(点阵码与字节关系)

数码管可以说是显示屏的一种, 通过控制其不同管脚的电流通断,会使其发光,从而显示出数字。因此它能够显示时间、日期、温度等...

2022-11-18 00:31:48查看全文 >>

饭盒有气压打不开怎么解决(饭盒抽真空打不开)

饭盒有气压打不开怎么解决(饭盒抽真空打不开)

1小熊S2123电热饭盒回顶部【PConline 海选导购】面对现在的外面,你还Hold得住吗?先是一波潲水油、地沟油事...

2022-11-18 00:38:05查看全文 >>

保温饭盒吸得太紧打不开怎么办(保温饭盒有气压打不开怎么办)

保温饭盒吸得太紧打不开怎么办(保温饭盒有气压打不开怎么办)

金属轻撬如果饭盒盖子打不开,我们可以使用小刀、钥匙等金属薄片,在杯盖和杯口的缝隙中轻轻的往上撬一下,空气进入饭盒中后,我...

2022-11-18 00:57:45查看全文 >>

饭盒吸住打不开妙招(热饭饭盒打不开有什么好办法)

饭盒吸住打不开妙招(热饭饭盒打不开有什么好办法)

原本今天早上煲好了一锅热气腾腾的银耳莲子红枣羹,想要带去公司做午饭的,刚刚出锅就盛进底层了!保温桶是上下两层,结果想吃的...

2022-11-18 00:56:11查看全文 >>

文档排行