2.7.5 符号计算图模型
Theano是将符号数学化的计算表示成计算图。这些计算图由apply节点和variable节点连接而成,apply节点与函数的应用相连,variable节点与数据相连。具体操作由op实例表示,而数据类型是由type实例表示的。接下来通过一个具体的示例来理解符号计算图的结构。
import theano.tensor as T x = T.dmatrix('x') y = T.dmatrix('y') z = x + y
图2.12 符号计算图
上述代码的逻辑非常简单,可以看出,分别定义了两个矩阵变量x和y,定义符号表达式z=x+y。该符号表达式转化为对应的符号计算图如图2.12所示。
在图2.12中,箭头表示各节点对所指向的Python对象的引用。变量指向apply节点的过程是用来表示函数通过对应的owner域来生成自身。这些apply节点是通过它们的inputs和outputs域来得到它们的输入和输出变量的。例如,变量x和变量y的值不是来自其他计算的结果,因此这两个变量的owner域指向了None,说明这两个变量的值不是由某个apply节点生成;变量z的owner域指向了图中的apply节点,这说明该变量的值来自该apply节点。
在图2.12中,apply节点的输出指向z,而z的owner域也指回apply节点的,通过符号变量z的owner域获取其apply节点:
>>>z.owner >>>Elemwise(add,no_inplace)(x,y)
通过apply节点的inputs和outputs域来获取表达式的所有输入符号变量和所有输出符号变量:
>>>z.owner.inputs [x,y] >>>z.owner.outputs [Elemwise{add,no_inplace}.0]
上述示例中,表达式是两个矩阵相加,形式比较简单,但对于复杂的表达式或函数,要画出完整的符号计算图是非常困难的。因此,Theano支持把计算图打印到终端或打印到外部文件。打印符号计算图之前需要先对printing模块进行定义。
有两种模式可以将计算图打印到终端:pprint模式和debugprint模式。pprint模式的输出结果简洁紧凑,类似于数学表达式;debugprint模式的输出更加详细,但相对烦琐。以前面提到的z=x+y为例,分别用pprint模式和debugprint模式来查看z的结果,具体如下所示。
>>>theano.printing.pprint(z) '(x+y)' >>>theano.printing.debugprint(z) Elemwise{add,no_inplace}[id A]'' |x[id B] |y[id C]