珠海房地产网站建设,网站有吗免费的,淘宝网首页官网登录,成都网站设计得多少钱注#xff1a;本文为《动手学深度学习》开源内容#xff0c;部分标注了个人理解#xff0c;仅为个人学习记录#xff0c;无抄袭搬运意图 8.1 命令式和符号式混合编程
本书到目前为止一直都在使用命令式编程#xff0c;它使用编程语句改变程序状态。考虑下面这段简单的命令… 注本文为《动手学深度学习》开源内容部分标注了个人理解仅为个人学习记录无抄袭搬运意图 8.1 命令式和符号式混合编程
本书到目前为止一直都在使用命令式编程它使用编程语句改变程序状态。考虑下面这段简单的命令式程序。
def add(a, b):return a bdef fancy_func(a, b, c, d):e add(a, b)f add(c, d)g add(e, f)return gfancy_func(1, 2, 3, 4) # 10和我们预期的一样在运行语句e add(a, b)时Python会做加法运算并将结果存储在变量e中从而令程序的状态发生改变。类似地后面的两条语句f add(c, d)和g add(e, f)会依次做加法运算并存储变量。
虽然使用命令式编程很方便但它的运行可能很慢。一方面即使fancy_func函数中的add是被重复调用的函数Python也会逐一执行这3条函数调用语句。另一方面我们需要保存变量e和f的值直到fancy_func中所有语句执行结束。这是因为在执行e add(a, b)和f add(c, d)这2条语句之后我们并不知道变量e和f是否会被程序的其他部分使用。
与命令式编程不同符号式编程通常在计算流程完全定义好后才被执行。多个深度学习框架如Theano和TensorFlow都使用了符号式编程。通常符号式编程的程序需要下面3个步骤
定义计算流程把计算流程编译成可执行的程序给定输入调用编译好的程序执行。
下面我们用符号式编程重新实现本节开头给出的命令式编程代码。
def add_str():return
def add(a, b):return a b
def fancy_func_str():return
def fancy_func(a, b, c, d):e add(a, b)f add(c, d)g add(e, f)return g
def evoke_str():return add_str() fancy_func_str()
print(fancy_func(1, 2, 3, 4))
prog evoke_str()
print(prog)
y compile(prog, , exec)
exec(y)输出
def add(a, b):return a bdef fancy_func(a, b, c, d):e add(a, b)f add(c, d)g add(e, f)return gprint(fancy_func(1, 2, 3, 4))10compile()函数的用法不多做赘述可以自行百度了解这里的compile()函数接受三个参数 prog这是包含Python源代码的字符串由evoke_str()函数生成。 这是文件名这里使用了一个空字符串因为我们没有从实际的文件中读取源代码。 exec这表示prog包含的是一个独立的程序即一个或多个语句而不是一个单一的表达式
以上定义的3个函数都仅以字符串的形式返回计算流程。最后我们通过compile函数编译完整的计算流程并运行。由于在编译时系统能够完整地获取整个程序因此有更多空间优化计算。例如编译的时候可以将程序改写成print((1 2) (3 4))甚至直接改写成print(10)。这样不仅减少了函数调用还节省了内存。
对比这两种编程方式我们可以看到以下两点。 命令式编程更方便。当我们在Python里使用命令式编程时大部分代码编写起来都很直观。同时命令式编程更容易调试。这是因为我们可以很方便地获取并打印所有的中间变量值或者使用Python的调试工具。 符号式编程更高效并更容易移植。一方面在编译的时候系统容易做更多优化另一方面符号式编程可以将程序变成一个与Python无关的格式从而可以使程序在非Python环境下运行以避开Python解释器的性能问题。
8.1.1 混合式编程取两者之长
大部分深度学习框架在命令式编程和符号式编程之间二选一。例如Theano和受其启发的后来者TensorFlow使用了符号式编程Chainer和它的追随者PyTorch使用了命令式编程而Gluon则采用了混合式编程的方式。
… 由于PyTorch仅仅采用了命令式编程所以跳过本节剩余部分感兴趣的可以去看原文