Python快乐编程:人工智能深度学习基础
上QQ阅读APP看书,第一时间看更新

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]