- Python快樂編程:人工智能深度學習基礎
- 千鋒教育高教產品研發部編著
- 1569字
- 2022-07-27 18:55:58
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個維度上不再支持廣播。
- GitLab Cookbook
- JavaScript:Functional Programming for JavaScript Developers
- Instant 960 Grid System
- Web程序設計(第二版)
- C語言程序設計
- Learning YARN
- UNIX Linux程序設計教程
- 后臺開發:核心技術與應用實踐
- 邊玩邊學Scratch3.0少兒趣味編程
- Learning Kotlin by building Android Applications
- Learning Shiny
- 軟件自動化測試實戰解析:基于Python3編程語言
- Learning Java by Building Android Games
- Oracle 11g寶典
- Sony Vegas Pro 11 Beginner’s Guide