深度学习程序模型
命令式编程 VS 符号式编程:Imperative vs. Symbolic Programs
作为 Python 程序开发者,基本上就是命令式编程。
import numpy as np
a = np.ones(10)
b = np.ones(10) * 2
c = b * a
d = c + 1
如上,程序在运行到c = b * a
时,python后台引擎就会直接去执行该计算任务,然后将结果赋值给c。
然后接着去计算下一个任务d = c + 1.
而符号式编程就不是这样,符号式编程会将声明计算任务和执行计算任务分离,将所有任务声明好,直到代码的最后才会去执行计算,即计算发生在最后一步
A = Variable('A')
B = Variable('B')
C = B * A
D = C + Constant(1)
# compiles the function
f = compile(D) # 将计算图编译成一个可执行的函数
d = f(A=np.ones(10), B=np.ones(10)*2) # 赋值,然后执行计算任务
上述代码会先定义出一个计算图,然后将计算图编译成一个可执行函数,最后在调用函数去执行计算任务。大部分符号式程序都会(显式explicitly/隐式implicitly)包含将计算图编程成可执行函数的步骤。
符号式编程最主要的特征就是清晰的分离定义计算图和编译计算图这2步骤。
命令式深度学习框架:
- Torch
- Chainer
- minerva
- MXNet
符号式深度学习框架:
- Theano
- CGT
- TensorFlow
- MXNet
特征 | Imperative Programs | Symbolic Programs |
---|---|---|
描述 | 命令式编程 | 符号式编程 |
特征 | 逐步执行每个计算任务 | 计算任务发生在最后一行 |
优点 | 灵活、方便 | 高效率、低内存消耗 |