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

2.4 Theano中的符號變量

使用編程語言進行編程時,需要用到各種變量來存儲各種數據信息,Theano雖然是基于Python和Numpy實現的數值計算工具庫,但有自己獨立的變量體系。Theano的變量類型被稱為符號變量(Tensor Variable),它是Theano表達式和運算操作的基本單元。Theano中所有符號變量都來源于一個基類:Tensorvariable(),即這些符號變量都是這個類的實例化,而這些符號變量本身的數據類型,通過實例化給定,通過訪問對象屬性得到object.type,它們在Theano的tensor模塊中。

一般情況下,首先需要導入Theano,否則會返回異常。Theano目前支持7種變量類型:col、matrix、row、scalar、tensor3、tensor4、vector。接下來演示如何使用內置方法定義向量類型的變量,具體如下所示:

    >>>import theano
    >>>import theano.tensor as T
    >>>x = T.vector(name = '變量名稱',dtype = '該實例化的符號變量的數據類型')

其中,vector()函數需要指定以下兩個參數:

· name——指定變量的名稱。

· dtype——指定變量的數據類型。目前Theano變量支持的數據類型有8種:int8、int16、int32、int64、float32、float64、complex64、complex128。

在創建其他類型的變量時,將vector替換成對應的變量類型即可,比如通過將vector替換成matrix即可創建矩陣類型的變量:T.matrix。

表2.1列出了常見的符號類型以及符號變量的數據類型。

表2.1 常見的符號類型

續表

表2.1的第一列是符號變量的類型,第二列是符號變量的數據類型,最后一列broadcastable屬性的作用是表示不同維度的矩陣之間是否可以廣播。

上述使用Theano內置的變量定義方法,只適用于處理四維以下的變量,當需要處理更高維的數據時,需要采用自定義變量類型的方法進行定義,自定義變量的一般形式如下所示:

    >>>import theano
    >>>import theano.tensor as T
    >>>mytype = T.TensorType(dtype,broadcastable

使用上述TensorType函數進行自定義變量操作時,dtype和broadcastable是必須指定的參數。

· dtype:指定變量的數據類型。目前Theano變量支持的數據類型有8種:int8、int16、int32、int64、float32、float64、complex64、complex128。

· broadcastable:是一個由True或False值構成的布爾類型元組,元組的大小等于變量的維度大小,如果元組中的某一個值為True,則表示變量在對應的維度上的數據可以進行廣播(broadcast),否則數據不能廣播。

接下來分別演示幾種常見的變量定義方法。

返回一個零維的numpy.ndarray:

    >>>theano.tensor.scalar(name = None, dtype = config.floatX)

返回一個一維的numpy.ndarray:

    >>>theano.tensor.vector(name = None, dtype = config.floatX)

返回一個二維的numpy.ndarray,但是行數保證是1:

    >>>theano.tensor.row(name = None, dtype = config.floatX)

返回一個二維的numpy.ndarray,但是列數保證是1:

    >>>theano.tensor.col(name = None, dtype = config.floatX)

返回一個二維的numpy.ndarray:

    >>>theano.tensor.matrix(name = None, dtype = config.floatX)

返回一個三維的numpy.ndarray:

    >>>theano.tensor.tensor3(name = None, dtype = config.floatX)

返回一個四維的numpy.ndarray:

    >>>theano.tensor.tensor4(name = None, dtype = config.floatX)

如果想要創建一個非標準的類型的變量,就需要用到自定義的TensorType。這需要將dtype和broadcasting pattern傳入聲明函數中。

創建一個五維向量的代碼如下所示。

    dtensor5 = TensorType('float64',(False,)*5)
    x = dtensor5()
    z = dtensor5('z')

可以通過以下代碼對已存在的類型進行重構。

    my_dmatrix = TensorType('float64',(False,)*2)
    x = my_dmatrix()                    #定義一個矩陣變量
    print my_dmatrix == dmatrix         #輸出為"True"

圖2.11 廣播的運算機制

TensorType函數有一個重要的參數broadcastable,該參數對變量是否可以進行廣播產生影響。廣播機制使得不同維度的張量進行加法或者乘法運算成為可能,它可以讓程序直接執行異構數據間的運算操作,避開異構數據間運算時維度轉換的過程。例如,將一個向量數據與一個高維矩陣相加,如果沒有廣播的機制,則需要先將低維的數據轉換成高維數據才能進行相應的操作符運算。通過廣播機制,標量可以直接與矩陣相加,向量可以直接和矩陣相加,標量可以直接和向量相加,廣播的運算機制如圖2.11所示。

圖2.11演示了廣播一個行矩陣的過程,其中,T和F分別表示True和False,表示廣播沿著哪個維度進行。如果第二個參數是向量,那么它的維度為(2,),廣播模式為(False,)。它將會自動向左展開,匹配矩陣的維度,最終得到維度為(1,2)和Boradcastable為(True,False)。

與numpy的廣播機制不同,Theano需要知道哪些維度需要進行廣播。當維度可以廣播時,廣播信息將會以變量的類型給出。

下面的代碼演示了在向量和矩陣的加法運算過程中,行和列是如何進行廣播的:

接下來通過TensorType方法創建一個五維張量類型,將其broadcastable設置成(False,)?5。此時,通過自定義方法新使創建的變量在5個維度上都不再支持廣播機制。

    import theano
    import theano.tensor as T
    mytype = T.TensorType('float32',(False,)*5)
    data = mytype('x')
    data.type()

結果如下所示:

    <TensorType(float32,5D)>

從結果可以看出,已經成功修改了所創建變量的屬性,使其在5個維度上不再支持廣播。

主站蜘蛛池模板: 屏东县| 吴堡县| 高阳县| 南和县| 米林县| 许昌县| 贞丰县| 新乡县| 乌兰察布市| 新乡市| 江门市| 永平县| 开化县| 龙海市| 花莲市| 达日县| 韶山市| 东至县| 莆田市| 上饶市| 九龙县| 上林县| 永顺县| 若羌县| 古交市| 安平县| 曲阜市| 莱芜市| 紫金县| 吉水县| 大名县| 武乡县| 阿巴嘎旗| 元氏县| 汪清县| 广德县| 新建县| 襄垣县| 万山特区| 马边| 绥棱县|