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

 

你可能感兴趣的:(生成模型,python)