1. 程式人生 > >第一節,基礎知識之第一步:代數

第一節,基礎知識之第一步:代數

utf-8 int32 數值 tor out 跳過 數據 如何 python函數

先聲明:theano模塊的內容大都是參考來源於網上,並親手實踐復現一遍,也有部分內容是自己補充

本文會列出所參考文章,如有版權問題,請聯系我,我會及時刪除

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 23 13:33:20 2018

@author: zy
"""

‘‘‘
x= T.dscalar(‘x‘)
y= T.dscalar(‘y‘)
z = x + y
f = theano.function([x,y],z)
調用re = f(2,3)
函數輸出的結果re:每個元素的類型,一般和該函數輸入傳入的符號變量類型(x,y)一致 並且該結果的類型為numpy.ndarray
函數f傳入參數時可以傳入比float64長度小的數據類型,比如int32
但是反過來不行 x= T.iscalar(‘x‘) f(2.2,3)會報錯
‘‘‘


‘‘‘ Theano2.1.2-基礎知識之第一步:代數 http://www.cnblogs.com/shouhuxianjian/p/4590234.html ‘‘‘ import theano.tensor as T import theano ‘‘‘ 一.兩個標量相加 ‘‘‘ #在學習theano開始,首先來感受下它是怎麽工作的,讓我們定義一個簡單的相加函數 x= T.dscalar(x) y= T.dscalar(y) z = x + y f = theano.function([x,y],z) #然後我們就可以開始使用創建好的函數了 print(f(2,3)) #
5.0 5.0為float64數據類型dscalar一致 print(type(f(1.0,2.3))) #<class ‘numpy.ndarray‘> print(f(1.0,2.3)) #3.3 ‘‘‘ 這裏首先把上面部分進行分布介紹,首先定義連個符號(變量),表示你想要相加的數。註意從現在開始,我們將會 使用變量(variable)來表示‘符‘(換句話說,就是x,y,z都是變量對象),函數f就是一個有著0維的numpy.ndarray 如果你想要一個整數,你可能會發現在執行function的時候有輕微的延時,這是一位將函數f編譯為C代碼
‘‘‘ #第一步 x = T.dscalar(x) y = T.dscalar(y) ‘‘‘ 在theano中,所有的符號都必選手動輸入。具體來說,T.dscalar就是我們分配給‘doubles類型(d)的0維數組(scalar)‘ 類型,這就是一個theano類型。 dscalar不是一個類,所以x,y都不是dscalar的實例。他們是TensorVariable的實例,正如你所看到的 ‘‘‘ print(type(x)) #<class ‘theano.tensor.var.TensorVariable‘> print(x.type) #TensorType(float64, scalar) print(T.dscalar) #TensorType(float64, scalar) ‘‘‘ 通過一個字符串參數來調用T.dscalar,可以創建一個變量便是一個給定名字下的一個浮點標量。如果不提供參數, 該符號將會是一個未命名的。雖然名字不是必須的,但是卻有助於調試。 ‘‘‘ #第二步 ‘‘‘ 結合x與y得到他們的和z ‘‘‘ z = x + y #z是另一個變量,同來表示x與y的和,你可以使用pp函數打印出與z關聯的計算結果 from theano import pp print(pp(z)) #(x + y) #第三步 ‘‘‘ 創建一個函數,將x與y作為輸入,然後通過z作為輸出 function():http://deeplearning.net/software/theano/library/compile/function.html#module-function ‘‘‘ f = theano.function([x,y],z) ‘‘‘ function第一個參數是變量的列表,用來作為輸入提供給函數。第二個參數是一個單一的變量或者一個變量列表。 在其它情況下,第二個參數就是我們想要的輸出。然後f可以被和普通python函數一樣的是用了 note:作為了一個快捷方式,你就可以跳過第三步,只使用一個變量的eval方法。eval()方法沒有function()這麽靈活, 不過卻能做教程中的任何事情。如果你不需要import function()的額外的福利,下面就是eval()工作的過程 ‘‘‘ w = z.eval({x:16.3,y:12.1}) print(w) #28.4 ‘‘‘ 我們給eval()傳遞一個dict,將符號theano遍歷映射成值從而來取代他們。然後對表達式計算返回數值 val() 在第一次調用的時候可能會比較慢,因為它需要調用 function() 來計算場景後面的表達式。之後對 eval() 以同樣的變量上的調用將會很快,因為變量已經將編譯後的函數進行緩存了。 ‘‘‘ ‘‘‘ 二.兩個矩陣相加 ‘‘‘ #你可能已經猜到如何來作了,確實這裏和之前的唯一的區別在於你需要實例化x與y,然後使用矩陣類型 x= T.dmatrix(x) y= T.dmatrix(y) z = x + y f = theano.function([x,y],z) print(x.type) #TensorType(float64, matrix) #dmatrix是doubles類型的矩陣,然後我們就能在2D數組上使用新的函數了 a1 = [[1,2],[3,4]] b1 = [[10,20],[30,40]] re = f(a1,b1) print(re) #[[ 11. 22.],[ 33. 44.]] print(type(re)) #<class ‘numpy.ndarray‘> print(re.dtype) #float64 #輸出值f是一個numpy.ndarray數組,我們可以直接使用numpy.ndarray作為輸入 import numpy as np re=f(np.array([[1,2],[3,4]]),np.array([[10,20],[20,40]])) print(re) #[[ 11. 22.],[ 33. 44.]] print(type(re)) #<class ‘numpy.ndarray‘> print(re.dtype) #float64 ‘‘‘ 計算矩陣加標量,矩陣加向量,向量加標量都是可以的,這都要歸功於braodcasting:http://deeplearning.net/software/theano/library/tensor/basic.html#libdoc-tensor-broadcastable 下面的類型都是可用的: 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 ( float32: scalar, vector, matrix, row, col, tensor3, tensor4 float32: fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4 double(float64): dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4 ) complex: cscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4 上面的列表不夠詳盡,針對使用Numpy數組來兼容所有類型的更詳細文檔可以看: tensor creation:http://deeplearning.net/software/theano/library/tensor/basic.html#libdoc-tensor-creation ‘‘‘ ‘‘‘ 三.練習 ‘‘‘ a1 = T.vector() #定義一個變量 print(a1.type) #TensorType(float32, vector) out1 = a1 + a1**2 #表達式 f1 = theano.function([a1],out1) #編譯函數 r1 = f1([0,1,2]) print(r1,r1.dtype) #[ 0. 2. 6.] float32 a2 = T.fvector() #定義一個變量 print(a2.type) #TensorType(float32, vector) out2 = a2 + a2**2 #表達式 f2 = theano.function([a2],out2) #編譯函數 r2 = f2([0,1,2]) print(r2,r2.dtype) #[ 0. 2. 6.] float32 a3 = T.dvector() #定義一個變量 print(a3.type) #TensorType(float64, vector) out3 = a3 + a3**2 #表達式 f3 = theano.function([a3],out3) #編譯函數 r3 = f3([0,1,2]) print(r3,r3.dtype) #[ 0. 2. 6.] float64 ‘‘‘ 從上面練習可以看出 float32: scalar, vector, matrix, row, col, tensor3, tensor4 float32: fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4 double(float64): dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4 ‘‘‘

a4 = T.iscalar(‘x‘) #TensorType(int32, scalar)
print(a4.type)
b4 = T.scalar(‘y‘) #TensorType(float32, scalar)
print(b4.type)
out4 = a4*b4
f4 = theano.function([a4,b4],out4)
r4 = f4(10,12)
print(r4) #120.0
print(r4.dtype) #float64
‘‘‘
我們可以看到乘積的類型變成了float64
‘‘‘

 

第一節,基礎知識之第一步:代數