版權聲明:本文為博主原創文章,未經博主允許不得轉載。
目錄(?)[+]
此文源于Theano官方教程,例子源于官方教程以及此處
代碼和例子都收錄在我的github中,求斧正,求粉求星星。
代碼如下
import numpyimport theano.tensor as Tfrom theano import function# 第一步,聲明兩個數學意義上的變量x = T.dscalar('x') # 浮點標量y = T.dscalar('y')z = x + y# f 返回的是一個0維度的numpy.ndarrayf = function([x, y], z) # 這兒會有一個明顯的延時,因為function需要編譯成C語言 PRint f(2, 3)print numpy.allclose(f(16.3, 12.1), 28.4)12345678910111234567891011在theano中每一個符號(就是代碼層次的變量)都要有一個類型(Type),這樣就能讓底層的C語言更好地處理代碼。 比如,T.dscalar
是一個“0-多維的浮點數(d)數組(標量)”,這是一種類型而不是一個類。所以x和y都不是dscalar
的實例,而是TensorVariable
的實例。但是x和y的類型是dscalar
,代碼如下
可以給每個變量附上名字,但是這不是必須的,一般用于debug。附上名字的方式就是上文代碼傳入一個字符。
第二部分是將x和y相加得到z
z = x + y11z是一個變量,用于表示x和y的和。可以用pp函數來打印出得出z的過程。
>>> from theano import pp>>> print(pp(z))(x + y)123123最后一步是創建一個function,x和y是輸入,z是輸出
f = function([x, y], z)11第一個參數是一個變量數組,表示function的輸入。第二個參數是一個變量或者一個變量數組,表示我們期盼的輸出。 f
可以作為一般的Python函數使用。
注意: 為了簡便,也可以跳過第三步,只是用
import numpyimport theano.tensor as Tx = T.dscalar('x')y = T.dscalar('y')z = x + yprint numpy.allclose(z.eval({x : 16.3, y : 12.1}), 28.4)123456123456eval
方法。但是eval()
方法不如function()
靈活,但是它也可以做到所有我們在教程中做到的東西。我們通過像
eval()
傳遞一個字典來表示theano變量的值,這個值可以代替這些變量參與運算。eval()
的第一次調用會比較慢,因為它要調用function()
去編譯解釋。兩個矩陣相加
這個依葫蘆畫瓢就可以大致解決了。
import numpyimport theano.tensor as Tfrom theano import functionx = T.dmatrix('x')y = T.dmatrix('y')z = x + yf = function([x, y], z)print f([[1, 2], [3, 4]], [[10, 20], [30, 40]])print f(numpy.array([[1, 2], [3, 4]]), numpy.array([[10, 20], [30, 40]]))123456789123456789
dmatrix
是用于表示浮點矩陣的類型,所以我們的f
就可以用于一個二維的數列。 我們也可以用numpy.array
作為輸入。當然,將標量加到矩陣,將向量加到矩陣,將標量加到向量等等都是可以的。這種操作被稱為broadcasting
下面羅列一些Theano的類型:
byte:bscalar, bvector, bmatrix, brow, bcol, btensor3, btensor4
16-bit integers:wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor4
32-bit integers:iscalar, ivector, imatrix, irow, icol, itensor3, itensor4
64-bit integers:lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4
float:fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4
double:dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4
complex:cscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4
習題
參照代碼
import theanoa = theano.tensor.vector() # declare variableout = a + a ** 10 # build symbolic expressionf = theano.function([a], out) # compile functionprint(f([0, 1, 2]))1234512345寫出
from __future__ import print_functionimport theanoa = theano.tensor.vector() # declare variableb = theano.tensor.vector() # declare variableout = a ** 2 + b ** 2 + 2 * a * b # build symbolic expressionf = theano.function([a, b], out) # compile functionprint(f([1, 2], [4, 5])) # prints [ 25. 49.]a2+b2+2?a?b 的代碼。
新聞熱點
疑難解答