深度学习中的编程风格
作者头像
  • 蔡维
  • 2019-10-27 07:20:19 5

导读

在深度学习领域,我们经常接触到多种框架,例如Facebook的PyTorch、Google的TensorFlow以及亚马逊的MXNet。这些框架主要采用三种编程模式:命令式编程、符号式编程和混合式编程。本文将探讨这三种编程模式的特点。

命令式编程

Python的编程风格常被称为命令式编程。在深度学习框架中,PyTorch就采用了这种编程模式。通过命令式编程,我们可以编写如下代码:

```python 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函数时,Python会依次调用add方法进行加法运算,并将结果存储在变量ef中。尽管这种方法代码简洁易懂,但其执行效率较低,且难以优化代码。此外,该方法允许获取中间结果,便于调试。

命令式编程的特点: - 代码简洁明了,易于理解 - 执行效率较低,难以优化代码 - 可以获取中间结果,便于调试

符号式编程

TensorFlow是一个典型的符号式编程框架,此外还包括Theano和Caffe。在符号式编程中,计算过程需要在完全定义后才能执行,通常包括以下三个步骤:定义计算流程、编译成可执行程序、调用编译好的程序执行。

下面是一段符号式编程的示例代码:

```python 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时,实际上并不会立即进行数值计算,而是生成一个计算图。大多数符号式编程都有一个隐性或显性的编译步骤,只有编译后的函数才能被调用。因此,在实际执行过程中,只有最后一行代码会触发数值计算。在此过程中,系统会对计算和内存进行优化,使得符号式编程的计算效率和内存利用率更高。此外,符号式编程可以将程序编译成一个独立于Python的函数,从而可以在非Python环境中运行,避免了Python解释器带来的性能问题。

符号式编程的特点: - 执行效率高,但代码难以理解 - 不保存中间变量,不利于调试 - 易于移植,可以跨平台和语言使用 - 不支持循环和选择结构

混合编程

大多数深度学习框架要么采用命令式编程,要么采用符号式编程,要么两者结合使用。混合编程旨在结合命令式编程和符号式编程的优点,使开发者既能享受命令式编程的简洁性,又能享受到符号式编程的高效性。

MXNet的gluon模块正是基于混合式编程的思想,用户可以使用命令式编程进行开发和调试,而在部署时可以将大部分命令式编程程序转换为符号式编程执行。

计算功能比较

最后,我们通过MXNet框架来对比命令式编程和符号式编程的性能差异。以下是测试代码:

```python 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 evalfun(net, x): starttime = time.time() for i in range(1000): _ = net(x) nd.waitall() return time.time() - start_time

测试命令式编程

print("命令式编程耗时: {:.4f}".format(eval_fun(net, x)))

将程序转换为符号式编程

net.hybridize()

再次测试符号式编程

print("符号式编程耗时: {:.4f}".format(eval_fun(net, x))) ```

通过这段代码可以发现,符号式编程的运行速度比命令式编程快约0.1秒。尽管这是一个三层网络,只迭代了1000次,但在实际应用中,网络结构通常更加复杂,数据量更大,迭代次数更多,因此实际运行中节约的时间会更多。

以上是对命令式编程、符号式编程及混合式编程的简要介绍。希望这些内容对您有所帮助。

    本文来源:图灵汇
责任编辑: : 蔡维
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
深度风格编程学习
    下一篇