圖結構(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])`
歡迎參與討論並關注本博客和微博以及知乎個人主頁後續內容繼續更新哦~
轉載請您尊重作者的勞動,完整保留上述文字以及文章鏈接,謝謝您的支持!