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}]