theano tutorial(十)Graph Structures

       Theano中将数学计算的工程用graph来进行表示。这些graph有一些内部节点构成:Apply,Variable和Op。Apply代表来将一些op应用于variables。注意区分用op表示的数学定义式和用实际的data来进行运算的实例(Application node) 。数据的类型使用Type实力来进行表示的。

import theano.tensor as T

x = T.dmatrix('x')
y = T.dmatrix('y')
z = x + y





 
  
 

下图演示了这段代码

         箭头代表了Python对象指向的参照。蓝色代表Apply节点,红色代表Variable节点,绿色代表Ops节点,紫色代表Types

    当我们创建来Variable并且将Ops应用到这个变量中来产生更多的变量时,我们穿件来二分、有向无环图。指向Apply节点的Variables节点代表了一个函数实例通过这个变量的owner域来创建他们的过程。反过来,Apply节点通过输入输出域来指向其输入和输出变量。(Apply实力也右一个关于输出的list,但这些指针在这个graph中没啥用)

       x,y的owner field都指向来None因为他们不是另一个计算的结果,如果他们是另一个计算的结果,那么他们的owner域将会指向另一个Apply节点,就像z一样。

       请注意,Apply实例的输出指向z,z.owner回指向Apply实例

贯穿整个图

      通过使用owner域整个图可以从输出向下贯穿到输入

print(type(y.owner))#y的owner是Apply节点
print(y.owner)
print(y.owner.op.name)
print(len(y.owner.inputs))
print(y.owner.inputs[0])
print(y.owner.inputs[1])#注意第二个输入并不是2,因为用DimShuffle对2进行了广播


<class 'theano.gof.graph.Apply'>
Elemwise{mul,no_inplace}(x, DimShuffle{x,x}.0)
Elemwise{mul,no_inplace}
2
x
DimShuffle{x,x}.0




 
 

进一步理解

print(type(y.owner.inputs[1]))#并不是constant2,而是tensor变量
print(type(y.owner.inputs[1].owner))#作为Aplly的输入
print( y.owner.inputs[1].owner.op )#inputs[1]使用op DimShuffle进行广播操作后的结果
print(y.owner.inputs[1].owner.inputs)

#结果
<class 'theano.tensor.var.TensorVariable'>
<class 'theano.gof.graph.Apply'>
DimShuffle{x,x}
[TensorConstant{2}]



你可能感兴趣的:(theano tutorial(十)Graph Structures)