前言
因为目前需要搭建一些关于RBM或者其他之类的模型,感觉不太会折腾caffe,然而我发现了几个有趣网址,使用theano实现了各种各样的模型,所以,尝试学一下theano。主要以官方教程为主,所以博客会以译文的方式公布,当然会有自己的一些小见解或者扩展,编程环境为win7+jupyter notebook,如若有误,谢谢指正
国际惯例,网址帖一波:
【PTVS+Theano+CPU/GPU】在windows下使用VS安装theano深度学习工具
theano搭建各种模型,包含RBM,CNN,RNN,AE等
基本数据类型定义及操作
因为theano的变量定义模块基本都存在theano.tensor中,所以我们先引入theano及其此模块
import theano
import theano.tensor as T
标量定义和操作
首先定义theano类型的两个标量,有两种方法:
-
单独为每一个标量定义
x=T.dscalar('x')
y=T.dscalar('y') -
或者一次性定义多个
x,y=T.dscalars('x','y')
-
然后定义两个标量之间的操作,并将它转换为theano可执行的函数
转换方法是theano.function(),具体如下
z=x+y
f=theano.function([x,y],z)可以发现function函数接受两个输入参数,第一个代表这个函数执行定义的功能所需要的输入信息,第二个代表这个函数提供的输出。这两个参数都可以是一个值或者一个列表,
f
就相当于python
中def
定义的函数。执行此函数看看,提供一个列表输入,和一个值输出
print f(1,2)
#3.0可以发现
theano
的dscalar
数据类型是double
,只不过用type输出来是float64
-
另一种不使用
function
的方法叫eval
,但是没function
灵活,实现同样的功能方法如下print z.eval({x:2,y:3})
#5.0它是将一个字典作为输入变量,然后返回表达式数值结果。第一次使用
eval()
会很慢,因为后台需要使用function()
编译表达式,但是后面相同的变量调用eval()
就快了,因为编译好的函数已经缓存了此变量
向量的定义和操作
-
两种定义方法
#x,y=T.dvectors('x','y')
x=T.dvector('x')
y=T.dvector('y') -
赋值,运算
import numpy as np
z=x+y
f=theano.function([x,y],z)
x1=np.array([1,2,3])
y1=np.array([4,5,6])
print f(x1,y1)
#[ 5. 7. 9.]
矩阵的赋值和运算
-
两种定义方法
# x=T.dmatrix('x')
# y=T.dmatrix('y')
x,y=T.dmatrices('x','y') -
赋值,运算
z=x+y
f=theano.function([x,y],z)
x2=np.array([[1,2,3],[4,5,6]])
y2=np.array([[1,4,7],[2,5,8]])
print f(x2,y2)
'''
[[ 2. 6. 10.]
[ 6. 10. 14.]]
'''
其它数据类型和操作
数据类型
上面讲的只有dscalar
,’dvector’,’dmatrix’,但是theano还提供了许多其它精度的变量类型
byte: bscalar, bvector, bmatrix, brow, bcol, btensor3, btensor4, btensor5
16-bit integers: wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor4, wtensor5
32-bit integers: iscalar, ivector, imatrix, irow, icol, itensor3, itensor4, itensor5
64-bit integers: lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4, ltensor5
float: fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4, ftensor5
double: dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4, dtensor5
complex: cscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4, ctensor5
其它与numpy
兼容的类型可以查询这里:tensor creation
变量操作
上面讲的都是标量、向量、矩阵各自之间的操作,theano还支持标量+矩阵, 向量+矩阵, 标量+向量之类的操作,详细查询: broadcasting
随便拿几个作为实例看看:
-
dot函数,如果输入是二维矩阵,那么就进行二维矩阵的乘法运算。如果输入的是一维向量,就进行向量间的点乘计算(不包含共轭复数),例子:
import theano
import theano.tensor as T
import numpy as np
#x,y=T.dvectors('x','y')
x=T.dvector('x')
y=T.dvector('y')
z1=T.dot(x,y)
f=theano.function([x,y],z1)
x1=np.array([1,2,3])
y1=np.array([4,5,6])
print f(x1,y1)
#32.0
#dot的向量乘积
#x,y=T.dvectors('x','y')
x=T.dmatrix('x')
y=T.dmatrix('y')
z1=T.dot(x,y)
f=theano.function([x,y],z1)
x2=np.array([[1,2,3],[4,5,6]])
y2=np.array([[1,4],[2,5],[7,8]])
print f(x2,y2)
'''
[[ 26. 38.]
[ 56. 89.]]
''' -
outer函数,向量外积
#outer 向量外积
#x,y=T.dvectors('x','y')
x=T.dvector('x')
y=T.dvector('y')
z3=T.outer(x,y)
f=theano.function([x,y],z3)
x1=np.array([1,2,3])
y1=np.array([4,5,6])
print f(x1,y1)
'''
[[ 4. 5. 6.]
[ 8. 10. 12.]
[ 12. 15. 18.]]
''' -
向量+矩阵
x=T.dvector('x')
y=T.dmatrix('y')
z4=x+y
f=theano.function([x,y],z4)
x1=np.array([1,2,3])
y1=np.array([[4,5,6],[7,8,9]])
print f(x1,y1)
'''
[[ 5. 7. 9.]
[ 8. 10. 12.]]
'''
官网介绍的剩下几个函数回头要用再慢慢补
练习
计算表达式a ** 2 + b ** 2 + 2 * a * b
标量形式
a,b=T.dscalars('a','b')
c=a ** 2 + b ** 2 + 2 * a * b
f=theano.function([a,b],c)
print f(2,3)
向量形式
a,b=T.dvectors('a','b')
c=a ** 2 + b ** 2 + 2 * a * b
f=theano.function([a,b],c)
print f([1,2],[4,5])
#[ 25. 49.]
所有code:链接: https://pan.baidu.com/s/1i4K5ULJ 密码: 5i69