Theano簡單入門(二)

一、Theano的基本用法

定義函數的方式:

步驟 0    宣告使用theano   import theano
步驟 1    定義輸入       x=theano.tensor.scalar() 這裏相當於tensorflow的placeholder
步驟 2    定義輸出       y=2*x
步驟3     定義fuction    f = theano.function([x],y)
步驟 4    調用函數     print f(-2)

步驟1 定義輸入變量 

      a = theano.tensor.scalar()

      b =theano.tensor.matrix()

簡化  import  theano.tensor as T

步驟2 定義輸出變量 需要和輸入變量的關係

     x1=T.matrix()

     x2=T.matrix()

     y1=x1*x2

     y2=T.dot(x1,x2) #矩陣乘法

步驟3 申明函數

     f= theano.function([x],y)

    函數輸入必須是list 帶[]

例如:

# -*- coding: UTF-8 -*-
import numpy as np
import theano.tensor as T
from theano import function

# basic
x = T.dscalar('x') # 建立標量x的容器,類似於tf.placeholder,但是直接標明瞭類型
y = T.dscalar('y') # 建立標量y的容器
z = x + y
# function first:imput sconed:output
# 使用 function 定義 theano 的方程, 
# 將輸入值 x, y 放在 [] 裏,  輸出值 z 放在後面
f = function([x,y],z) # 將確切的 x, y 值放入方程中
# 5.0

print(f(2,3))

# to pretty-print the function 打印原始方程
from theano import pp
print(pp(z))

# how about matix
x = T.dmatrix('x') # 矩陣 x 的容器
y = T.dmatrix('y') # 矩陣 y 的容器
# z = T.dot(x,y)  # 定義矩陣乘法
z = x + y  # 定義矩陣加法
# function first:imput sconed:output
f = function([x,y],z) 
print(
	f(
		np.arange(12).reshape((3,4)),
		10*np.ones((3,4))
	)
)

二、Theano的常用數據類型

上面的例子當中涉及到了Theano常用的數據類型:例如T.dscalar()、T.dmatrix()。

在theano.tensor數據類型中,有double、int、uchar、float等各種類型,不過我們最常用到的是int和float類型,float是因爲GPU一般是float32類型,所以在編寫程序的時候,我們很少用到double,常用的數據類型如下:

數值:iscalar(int類型的變量)、fscalar(float類型的變量)

一維向量:ivector(int 類型的向量)、fvector(float類型的向量)、

二維矩陣:fmatrix(float類型矩陣)、imatrix(int類型的矩陣)

三維float類型矩陣:ftensor3  

四維float類型矩陣:ftensor4

三、Function的用法

3.1 寫一個激勵函數,例如Sigmoid函數:

# activation function example
x = T.dmatrix('x')
s = 1/(1 + T.exp(-x)) # logistic or soft step
logistic = theano.function([x],s)
print(logistic([[0,1],[-2,-3]]))

3.2 多輸出的function:

# multiply outputs for a function
a,b = T.dmatrices('a','b')
diff = a - b
abs_diff = abs(diff)
diff_squared = diff**2
f = theano.function([a,b],[diff,abs_diff,diff_squared])
print(f(
		np.ones((2,2)),
		np.arange(4).reshape((2,2))
	)
)
# 可以使用多個變量進行接收function的輸出,在進行操作
x1,x2,x3 = f(
	np.ones((2,2)),
	np.arange(4).reshape((2,2))
)
print(x1)

3.3 function的名字

# name for a function
x,y,w = T.dscalars('x','y','w')
z = (x+y)*w
f = theano.function([x,theano.In(y,value=1),theano.In(w,value=2,name='weights')],z)
print(f(23,))
print(f(23,2))
print(f(23,2,weights=4))

3.4 求偏導數

#coding=utf-8  
import theano  
x =theano.tensor.fscalar('x')#定義一個float類型的變量x  
y= 1 / (1 + theano.tensor.exp(-x))#定義變量y  
dx=theano.grad(y,x)#偏導數函數  
f= theano.function([x],dx)#定義函數f,輸入爲x,輸出爲s函數的偏導數  
print f(3)#計算當x=3的時候,函數y的偏導數 

3.5 共享變量

共享變量是多線程編程中的一個名詞,故名思議就是各線程,公共擁有的變量,這個是爲了多線程高效計算、訪問而使用的變量。因爲深度學習中,我們整個計算過程基本上是多線程計算的,於是就需要用到共享變量。在程序中,我們一般把神經網絡的參數W、b等定義爲共享變量,因爲網絡的參數,基本上是每個線程都需要訪問的。

# -*- coding: UTF-8 -*-
import numpy as np
import theano.tensor as T
import theano

# 定義共享變量,要用 np.array 給它賦予初始值,初始值是 0,並且它的數據類型要規定好。數據類型是很重要的,在後面要定義 vector 或者 matrix 的時候,一定要統一,否則就會報錯。 這個例子中,我們定義它爲float64,所以在後面定義其他結構的時候,也要保證這樣的數據類型。 最後一個參數就是它的名字 'state'。
state = theano.shared(np.array(0,dtype=np.float64),'state')
# 下面是累加值,定義它的名字爲 inc,還有它的數據類型,調用 state.dtype,而不是寫 dtype=np.float64, 否則會報錯。
inc = T.scalar('inc',dtype=state.dtype)
# 接下來是要定義一個 accumulator 函數,它的輸入參數爲 inc,結果就是輸出 state,累加的過程叫做 updates,就是要把現在的 state 變成 state+inc 。
accumulator = theano.function([inc],state,updates=[(state,state+inc)])

# print(accumulator(10))
# print(accumulator(10))

# to get variable value 可以用到保存模型
print(state.get_value())
# 0.0
accumulator(1)
print(state.get_value())
# 1.0
accumulator(10)
print(state.get_value())
# 11.0

# to set variable value 可以用到設置模型,將訓練好的模型用到新的模型上
state.set_value(-1)
accumulator(3)
print(state.get_value())
# 2.0

# temporarily replace shared variable with another value 臨時使用修改
tmp_func = state*2 + inc
#有時只是想暫時使用 Shared 變量,並不需要把它更新: 這時我們可以定義一個 a 來臨時代替 state,注意定義 a 的時候也要統一 dtype。
a = T.scalar(dtype=state.dtype)
skip_shared = theano.function([inc,a],tmp_func,givens=[(state,a)])
print(skip_shared(2,3))
# 8.0

print(state.get_value())
# 2.0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章