1. 程式人生 > >Theano中文翻譯教程(一). 基礎騙之 Baby Steps

Theano中文翻譯教程(一). 基礎騙之 Baby Steps

初步-代數

兩個數求和

讓我們來開始學習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語言

第一步

>>> x = T.dscalar('x')
>>> y = T.dscalar('y')
在Theano中,所有的變數都要被事先定義。T.dscalar就是這樣的一種方法來定義一個0維的陣列 dscalar不是一個類,因此不論x還是y都不是它的例項而是TensorVariable的例項。我們可以利用type來進行證明:
>>> 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/

並對有些文字進行了適當的刪改