分類:版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
目錄(?)[+]
此文源于Theano官方教程,例子源于官方教程以及此處
代碼和例子都收錄在我的github中,求斧正,求粉求星星。
代碼如下
import numpyimport theano.tensor as Tfrom theano import function# 第一步,聲明兩個(gè)數(shù)學(xué)意義上的變量x = T.dscalar('x') # 浮點(diǎn)標(biāo)量y = T.dscalar('y')z = x + y# f 返回的是一個(gè)0維度的numpy.ndarrayf = function([x, y], z) # 這兒會(huì)有一個(gè)明顯的延時(shí),因?yàn)閒unction需要編譯成C語言 PRint f(2, 3)print numpy.allclose(f(16.3, 12.1), 28.4)12345678910111234567891011在theano中每一個(gè)符號(hào)(就是代碼層次的變量)都要有一個(gè)類型(Type),這樣就能讓底層的C語言更好地處理代碼。 比如,T.dscalar是一個(gè)“0-多維的浮點(diǎn)數(shù)(d)數(shù)組(標(biāo)量)”,這是一種類型而不是一個(gè)類。所以x和y都不是dscalar的實(shí)例,而是TensorVariable的實(shí)例。但是x和y的類型是dscalar,代碼如下
可以給每個(gè)變量附上名字,但是這不是必須的,一般用于debug。附上名字的方式就是上文代碼傳入一個(gè)字符。
第二部分是將x和y相加得到z
z = x + y11z是一個(gè)變量,用于表示x和y的和。可以用pp函數(shù)來打印出得出z的過程。
>>> from theano import pp>>> print(pp(z))(x + y)123123最后一步是創(chuàng)建一個(gè)function,x和y是輸入,z是輸出
f = function([x, y], z)11第一個(gè)參數(shù)是一個(gè)變量數(shù)組,表示function的輸入。第二個(gè)參數(shù)是一個(gè)變量或者一個(gè)變量數(shù)組,表示我們期盼的輸出。 f可以作為一般的Python函數(shù)使用。
注意: 為了簡便,也可以跳過第三步,只是用
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()傳遞一個(gè)字典來表示theano變量的值,這個(gè)值可以代替這些變量參與運(yùn)算。eval()的第一次調(diào)用會(huì)比較慢,因?yàn)樗{(diào)用function()去編譯解釋。兩個(gè)矩陣相加
這個(gè)依葫蘆畫瓢就可以大致解決了。
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是用于表示浮點(diǎn)矩陣的類型,所以我們的f就可以用于一個(gè)二維的數(shù)列。 我們也可以用numpy.array作為輸入。當(dāng)然,將標(biāo)量加到矩陣,將向量加到矩陣,將標(biāo)量加到向量等等都是可以的。這種操作被稱為broadcasting
下面羅列一些Theano的類型:
byte:bscalar, bvector, bmatrix, brow, bcol, btensor3, btensor416-bit integers:wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor432-bit integers:iscalar, ivector, imatrix, irow, icol, itensor3, itensor464-bit integers:lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4float:fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4double:dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4complex:cscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4習(xí)題
參照代碼
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 的代碼。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注