theano学习笔记(二) :基础

一.基本代数运算

Ⅰ.标量相加

引入官方文档的一段代码

import numpy as np
import theano.tensor as T
from theano import function

x=T.dscalar('x')
y=T.dscalar('y')
z=x+y
f=function([x,y],z)
print(f(2,3))
print(np.allclose(f(16.3,12.1),28.4))

这里写图片描述

从第1,2,3句的载入开始.
第一句话不用说,第二句和第三句分别从theano包中引入了tensor和function.那么首先就开始基本讲一下tensor和function的基本概念

1.tensor基本

Tensor是theano的一个subpackage,Theano支持python所有的基本的对象,但是更重要的是他支持符号化的矩阵表示.

1.创建tensor类型的变量

最基本的就是创建tensor类型的变量了,theano提供了很多预先定义的tensor类型来创建tensor变量,这里所有的构造函数都提供一个可选的名字的参数,用来为变量命名以利于debug.

最常用的创建的构造函数(默认都是浮点型的数值)
theano.tensor. scalar ( name=None, dtype=config.floatX)
返回的是0维的ndarray(标量)

theano.tensor. vector ( name=None, dtype=config.floatX)
返回的是1维的ndarray(一维向量)

theano.tensor. row ( name=None, dtype=config.floatX)
Return a Variable for a 2-dimensional ndarray in which the number of rows is guaranteed to be 1.

theano.tensor. col ( name=None, dtype=config.floatX)
Return a Variable for a 2-dimensional ndarray in which the number of columns is guaranteed to be 1.

theano.tensor. matrix ( name=None, dtype=config.floatX)
Return a Variable for a 2-dimensional ndarray

theano.tensor. tensor3 ( name=None, dtype=config.floatX)
Return a Variable for a 3-dimensional ndarray

theano.tensor. tensor4 ( name=None, dtype=config.floatX)
Return a Variable for a 4-dimensional ndarray

全类型的构造函数
这里写图片描述
这里写图片描述

一次性产生多个变量(其实就是原来的构造函数的后面加上了一个s):
iscalars, lscalars, fscalars, dscalars
Return one or more scalar variables.
ivectors, lvectors, fvectors, dvectors
Return one or more vector variables.
irows, lrows, frows, drows
Return one or more row variables.
icols, lcols, fcols, dcols
Return one or more col variables.
imatrices, lmatrices, fmatrices, dmatrices
Return one or more matrix variables.

具体用法是:
方法一:创建n个不指定名称的变量(括号里面加上数量)
x, y, z = dmatrices(3)
方法二:根据给定的名称,创建相应的变量,并且名称的多少就是变量的多少.
x, y, z = dmatrices(‘x’, ‘y’, ‘z’)

2.创建自定义的tensor类型

前面都是有系统提供的构造函数来创建固定形式的tensor变量,但是要是自己有特殊的需要的话,就要创建自定义的tensor类型.这里就需要先介绍一下TensorType这个类.
class theano.tensor. TensorType ( Type)
构造函数格式:init ( self, dtype, broadcastable)
也就是说,在创建自定义类型的时候,传入类型和broadcastable就行.
首先是常见的dtype
这里写图片描述
然后就是常见的broadcastable模式
这里写图片描述
所以,要是想创建一个5维的tensor就能够像下面这样.

import numpy as np
import theano.tensor as T
dtensor5=T.TensorType('float64',(False,)*5) #创建一个5维的tensor
x=dtensor5()
print(type(x))

结果为:class ‘theano.tensor.var.TensorVariable’

还有自己创建的类型能够和系统提供同样的类型

import numpy as np
import theano.tensor as T

my_matrix=T.TensorType('float64',(False,)*2)  #创建一个2维的tensor
x=my_matrix
print(my_matrix==T.dmatrix)   #和系统自带的dmatrix是一样的.

结果为:True

3.从python对象转换.
另外一种创建一个Tensor变量的方式就是使用shared()函数.

2.function基本

暂时只要知道标准形式如下
function. function ( inputs, outputs, mode=None, updates=None, givens=None,no_default_updates=False, accept_inplace=False, name=None,rebuild_strict=True, allow_input_downcast=None, profile=None,on_unused_input=’raise’)
其中inputs是输入的那些变量,outputs是表达式输出的变量.

有了前面提到的基本知识之后,我们再回到之前的那个例子
对于第5,6句

x=T.dscalar('x')
y=T.dscalar('y')

这两句话,这两句话是创建了两个double类型的标量(参照前面的表格).需要注意的是,dscalar不是一个类,他们是TensorVariable类的实例.
然后就是这个里面为变量指定的名字(括号里面的字符串就是),不是必须要求为每个变量指定名称,但是命名之后能够促进debug

对于第7句

z=x+y

其实就是求和.z是另外一个变量表示这是x和y的和.
下面的几行用来检测z的一些性质


import numpy as np
from theano import *
import theano.tensor as T
from theano import pp

x=T.dscalar('x')
y=T.dscalar('y')
z=x+y

print(type(z))
print(pp(z))

运行结果:
class ‘theano.tensor.var.TensorVariable’
(x + y)
也就是说z也会成为和x,y一样类型的变量,同时,能够知道他的”具体表达式”,这里需要注意的是,pp函数生成的表达式(x+y)其中的x和y都是我们之前指定的名字.不是变量名,不要弄混淆了.
对于第8句,

f=function([x,y],z)

我们之前在介绍function的时候提到只要知道第一个参数是输入列表,第二个参数是输出列表,之前的表达式恰年已经给出,用过这个函数之后,接下来的使用就像正常函数一样使用了.本质就是给定输入然后得到想要的输出.
这一部分就结束了.很简单.

Ⅱ.矩阵相加

有了上面的基础,矩阵相加就非常简单了.
几乎只用改动很少的部分.

import numpy as np
from theano import *
import theano.tensor as T
from theano import pp
from theano import function

x=T.dmatrix('leo')
y=T.dmatrix('tom')
z=x+y

print(type(z))
print(pp(z))
f=function([x,y],z)
print(f([[1,2,3],[1,2,3]],[[2,3,4],[2,3,4]]))

发现改动的地方只有生命tensor类型的那里,还有就是后面相应的变量改变了.
结果:
这里写图片描述
同样,也能够用numpy中的array类型

print(f(np.array([[1,2,3],[1,2,3]]),
        np.array([[2,3,4],[2,3,4]])))

出来的结果也是一样的.

Ⅲ.一个练习

求表达式a ** 2 + b ** 2 + 2 * a * b(其中a和b一维向量)

import numpy as np
from theano import *
import theano.tensor as T
from theano import pp
from theano import function

a=T.dvector('a')
b=T.dvector('b')
out=a**2+b**2+2*a*b
f=function([a,b],out)
print(f(np.array([1,2,3]),np.array([1,2,3])))

很简单.

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值