Theano中文翻譯教程(一). 基礎騙之 Baby Steps
阿新 • • 發佈:2019-01-24
初步-代數
兩個數求和
讓我們來開始學習Theano。為了對我們所用的工具有一個直觀的感受,我們首先來做一個簡單的函式:兩個數的求和。下面就是函式的定義方法:現在我們就可以使用這個函數了>>> import numpy >>> import theano.tensor as T >>> from theano import function >>> x = T.dscalar('x') >>> y = T.dscalar('y') >>> z = x + y >>> f = function([x, y], z)
>>> f(2, 3)
array(5.0)
>>> numpy.allclose(f(16.3, 12.1), 28.4)
True
讓我們開始一步一步地學習這些操作。第一步就是定義兩個符號x和y(變數),顯而易見這是因為我們要進行兩個數的相加。此時定義的函式的輸出是0維的 numpy.ndarray。
如果你在執行這些程式碼,你就會發現當我們執行function指令時,電腦有一些延遲,那是因為函式f正在被編譯成C語言
第一步
在Theano中,所有的變數都要被事先定義。T.dscalar就是這樣的一種方法來定義一個0維的陣列 dscalar不是一個類,因此不論x還是y都不是它的例項而是TensorVariable的例項。我們可以利用type來進行證明:>>> x = T.dscalar('x') >>> y = T.dscalar('y')
>>> type(x) <class 'theano.tensor.var.TensorVariable'> >>> x.type TensorType(float64, scalar) >>> T.dscalar TensorType(float64, scalar) >>> x.type is T.dscalar True
通過T.dscalar方法我們可以定義float型別的變數並命名。如果你不傳入任何引數,這個變數就沒有被命名。當然命名與否沒有什麼關係,但是對變數進行命名可以方便除錯程式碼
如果你想知道更多關於Theano內部的結構,你可以點選這裡
第二步
第二步就是把x和y進行相加得到z>>> z = x + y
z是另一個變數代表著x與y的相加。你可以用 pp 函式去列印變數z
>>> from theano import pp
>>> print(pp(z))
(x + y)
第三步
最後一步就是定義一個函式,令x和y為輸入變數(自變數),z為輸出變數(因變數)。顯而易見傳入的第一個引數為輸入變數,第二個引數為輸出變數,並且輸出變數可以為一個也可以為多個。>>> f = function([x, y], z)
注:有的時候為了簡潔,我們可以跳過第三步,利用 eval() 函式。該函式雖然沒有 function() 那麼的自由,但是對於本教程裡的內容我們都可以用 eval() 來表示
>>> import numpy
>>> import theano.tensor as T
>>> x = T.dscalar('x')
>>> y = T.dscalar('y')
>>> z = x + y
>>> numpy.allclose(z.eval({x : 16.3, y : 12.1}), 28.4)
True
兩個矩陣求和
你可以猜到該怎麼操作了。確實,唯一的變化就是定義變數x和y的型別為矩陣型別>>> x = T.dmatrix('x')
>>> y = T.dmatrix('y')
>>> z = x + y
>>> f = function([x, y], z)
dmatrix是可以表示浮點數的矩陣型別。現在我們就可以用2D矩陣來使用新的函式
>>> f([[1, 2], [3, 4]], [[10, 20], [30, 40]])
array([[ 11., 22.],
[ 33., 44.]])
變數是 Numpy array型別的, 因此我們可以直接利用 Numpy array 做為輸入
>>> import numpy
>>> f(numpy.array([[1, 2], [3, 4]]), numpy.array([[10, 20], [30, 40]]))
array([[ 11., 22.],
[ 33., 44.]])
此外數字加上矩陣,向量加上矩陣,數字加上向量都是可以的, 這些操作被定義為 broadcasting詳情請戳這裡
練習
import theano
a = theano.tensor.vector() # declare variable
out = a + a ** 10 # build symbolic expression
f = theano.function([a], out) # compile function
print(f([0, 1, 2]))
[ 0. 2. 1026.]
修改你的程式碼,使之能夠執行這個表示式: a ^ 2 + b ^ 2 + 2 * a * b 結果在本文後面
%%%%%%%%%%%%%%%%%%%%%%華麗的分割線開始%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%華麗的分割線結束%%%%%%%%%%%%%%%%%%%%%%%%%%%%
from __future__ import print_function
import theano
a = theano.tensor.vector() # declare variable
b = theano.tensor.vector() # declare variable
out = a ** 2 + b ** 2 + 2 * a * b # build symbolic expression
f = theano.function([a, b], out) # compile function
print(f([1, 2], [4, 5])) # prints [ 25. 49.]
本文翻譯自:http://deeplearning.net/software/theano/tutorial/
並對有些文字進行了適當的刪改