【theano-windows】学习笔记一——theano中的变量

时间:2022-12-12 12:57:19

前言

因为目前需要搭建一些关于RBM或者其他之类的模型,感觉不太会折腾caffe,然而我发现了几个有趣网址,使用theano实现了各种各样的模型,所以,尝试学一下theano。主要以官方教程为主,所以博客会以译文的方式公布,当然会有自己的一些小见解或者扩展,编程环境为win7+jupyter notebook,如若有误,谢谢指正

国际惯例,网址帖一波:

【PTVS+Theano+CPU/GPU】在windows下使用VS安装theano深度学习工具

theano官方文档

theano搭建各种模型,包含RBM,CNN,RNN,AE等

python基础教程
theano中文翻译

基本数据类型定义及操作

因为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就相当于pythondef定义的函数。

    执行此函数看看,提供一个列表输入,和一个值输出

    print f(1,2)

    #3.0

    可以发现theanodscalar数据类型是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