图结构(Graph Structures)这是理解Theano该基金会的内部运作。
Theano编程的核心是用符号占位符把数学关系表示出来。
图结构的组成部分
如图实现了这段代码:
importtheano.tensor as T
x= T.matrix('x')
y= T.matrix('y')
z= x + y
变量节点(variable nodes)
红色表示。
变量节点都有owner。当中x与y的owner为none。
z的owner为apply。
操作节点(op nodes)
绿色表示。表示各个变量之间的运算(比如+, -, **, sum(),tanh()等等)。
应用节点(apply nodes)
蓝色表示。
其它节点都连在上面。
分析nodes相应属性
对于下面代码。分析其节点属性。
importtheano.tensor as T
x= T.dmatrix('x')
y= x * 2.
>>>y.owner.op.name
'Elemwise{mul,no_inplace}'#y的owner是apply而apply的op是'Elemwise{mul,no_inplace}'
>>>len(y.owner.inputs)
2#两个输入
>>>y.owner.inputs[0]
x#第一个输入是x矩阵
>>>y.owner.inputs[1]
InplaceDimShuffle{x,x}.0
#注意这里第二个输入并非2。而是和x相同大小的矩阵框架,由于等会要广播才干相乘
>>>type(y.owner.inputs[1])
<class'theano.tensor.basic.TensorVariable'>
>>>type(y.owner.inputs[1].owner)
<class'theano.gof.graph.Apply'>
>>>y.owner.inputs[1].owner.op
<class'theano.tensor.elemwise.DimShuffle object at 0x14675f0'>#用DimShuffle把2广播出来
>>>y.owner.inputs[1].owner.inputs
[2.0]#矩阵框架的owner才是2
自己主动优化
编译Theano事实上是编译了一张图。这张图从输入变量開始贯穿全图直到输出变量。
Theano能够检測关键子图。来进行替换,防止反复,以达到优化的目的。比方用x替换xy/y。
举个样例
>>>import theano
>>>a = theano.tensor.vector("a") # declare symbolic variable
>>>b = a + a ** 10 #build symbolic expression
>>>f = theano.function([a], b) #compile function
>>>print f([0, 1, 2]) #prints `array([0,2,1026])`
优化前
优化后
欢迎參与讨论并关注本博客和微博以及知乎个人主页兴许内容继续更新哦~
转载请您尊重作者的劳动,完整保留上述文字以及文章链接。感谢您的支持!