一、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