官术网_书友最值得收藏!

2.7.5 符號(hào)計(jì)算圖模型

Theano是將符號(hào)數(shù)學(xué)化的計(jì)算表示成計(jì)算圖。這些計(jì)算圖由apply節(jié)點(diǎn)和variable節(jié)點(diǎn)連接而成,apply節(jié)點(diǎn)與函數(shù)的應(yīng)用相連,variable節(jié)點(diǎn)與數(shù)據(jù)相連。具體操作由op實(shí)例表示,而數(shù)據(jù)類型是由type實(shí)例表示的。接下來通過一個(gè)具體的示例來理解符號(hào)計(jì)算圖的結(jié)構(gòu)。

    import theano.tensor as T
    x = T.dmatrix('x')
    y = T.dmatrix('y')
    z = x + y

圖2.12 符號(hào)計(jì)算圖

上述代碼的邏輯非常簡單,可以看出,分別定義了兩個(gè)矩陣變量x和y,定義符號(hào)表達(dá)式z=x+y。該符號(hào)表達(dá)式轉(zhuǎn)化為對(duì)應(yīng)的符號(hào)計(jì)算圖如圖2.12所示。

在圖2.12中,箭頭表示各節(jié)點(diǎn)對(duì)所指向的Python對(duì)象的引用。變量指向apply節(jié)點(diǎn)的過程是用來表示函數(shù)通過對(duì)應(yīng)的owner域來生成自身。這些apply節(jié)點(diǎn)是通過它們的inputs和outputs域來得到它們的輸入和輸出變量的。例如,變量x和變量y的值不是來自其他計(jì)算的結(jié)果,因此這兩個(gè)變量的owner域指向了None,說明這兩個(gè)變量的值不是由某個(gè)apply節(jié)點(diǎn)生成;變量z的owner域指向了圖中的apply節(jié)點(diǎn),這說明該變量的值來自該apply節(jié)點(diǎn)。

在圖2.12中,apply節(jié)點(diǎn)的輸出指向z,而z的owner域也指回apply節(jié)點(diǎn)的,通過符號(hào)變量z的owner域獲取其apply節(jié)點(diǎn):

    >>>z.owner
    >>>Elemwise(add,no_inplace)(x,y)

通過apply節(jié)點(diǎn)的inputs和outputs域來獲取表達(dá)式的所有輸入符號(hào)變量和所有輸出符號(hào)變量:

    >>>z.owner.inputs
    [x,y]
    >>>z.owner.outputs
    [Elemwise{add,no_inplace}.0]

上述示例中,表達(dá)式是兩個(gè)矩陣相加,形式比較簡單,但對(duì)于復(fù)雜的表達(dá)式或函數(shù),要畫出完整的符號(hào)計(jì)算圖是非常困難的。因此,Theano支持把計(jì)算圖打印到終端或打印到外部文件。打印符號(hào)計(jì)算圖之前需要先對(duì)printing模塊進(jìn)行定義。

有兩種模式可以將計(jì)算圖打印到終端:pprint模式和debugprint模式。pprint模式的輸出結(jié)果簡潔緊湊,類似于數(shù)學(xué)表達(dá)式;debugprint模式的輸出更加詳細(xì),但相對(duì)煩瑣。以前面提到的z=x+y為例,分別用pprint模式和debugprint模式來查看z的結(jié)果,具體如下所示。

    >>>theano.printing.pprint(z)
    '(x+y)'
    >>>theano.printing.debugprint(z)
    Elemwise{add,no_inplace}[id A]''
    |x[id B]
    |y[id C]
主站蜘蛛池模板: 溧阳市| 泗水县| 孝昌县| 潜山县| 专栏| 五常市| 中牟县| 武穴市| 南京市| 米脂县| 当涂县| 阳新县| 东阿县| 宁南县| 崇州市| 凌源市| 上杭县| 横山县| 双鸭山市| 布尔津县| 鹤峰县| 隆回县| 思南县| 温宿县| 兴业县| 四川省| 桂阳县| 凤冈县| 仙居县| 剑川县| 丹棱县| 漳浦县| 平江县| 永安市| 江华| 元阳县| 美姑县| 小金县| 竹溪县| 汽车| 佛坪县|