首页 > 学院 > 开发设计 > 正文

theano学习初步(一)

2019-11-14 11:31:44
字体:
来源:转载
供稿:网友

http://blog.csdn.net/u013007900/article/details/52439172

theano学习初步(一)

2016-09-05 12:29 510人阅读 评论(0) 收藏 举报 分类:

目录(?)[+]

此文源于Theano官方教程,例子源于官方教程以及此处

代码和例子都收录在我的github中,求斧正,求粉求星星。

两个标量相加

代码如下

import numpyimport theano.tensor as Tfrom theano import function# 第一步,声明两个数学意义上的变量x = T.dscalar('x') # 浮点标量y = T.dscalar('y')z = x + y# f 返回的是一个0维度的numpy.ndarrayf = function([x, y], z) # 这儿会有一个明显的延时,因为function需要编译成C语言 PRint f(2, 3)print numpy.allclose(f(16.3, 12.1), 28.4)12345678910111234567891011

第一步

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

在theano中每一个符号(就是代码层次的变量)都要有一个类型(Type),这样就能让底层的C语言更好地处理代码。 比如,T.dscalar是一个“0-多维的浮点数(d)数组(标量)”,这是一种类型而不是一个类。所以x和y都不是dscalar的实例,而是TensorVariable的实例。但是x和y的类型是dscalar,代码如下

>>> type(x)<class 'theano.tensor.var.TensorVariable'>>>> x.typeTensorType(float64, scalar)>>> T.dscalarTensorType(float64, scalar)>>> x.type is T.dscalarTrue1234567812345678

可以给每个变量附上名字,但是这不是必须的,一般用于debug。附上名字的方式就是上文代码传入一个字符。

第二步

第二部分是将x和y相加得到z

z = x + y11

z是一个变量,用于表示x和y的和。可以用pp函数来打印出得出z的过程。

>>> from theano import pp>>> print(pp(z))(x + y)123123

第三步

最后一步是创建一个function,x和y是输入,z是输出

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

第一个参数是一个变量数组,表示function的输入。第二个参数是一个变量或者一个变量数组,表示我们期盼的输出。 f可以作为一般的Python函数使用。

注意: 为了简便,也可以跳过第三步,只是用eval方法。但是eval()方法不如function()灵活,但是它也可以做到所有我们在教程中做到的东西。

import numpyimport theano.tensor as Tx = T.dscalar('x')y = T.dscalar('y')z = x + yprint numpy.allclose(z.eval({x : 16.3, y : 12.1}), 28.4)123456123456

我们通过像eval()传递一个字典来表示theano变量的值,这个值可以代替这些变量参与运算。 eval()的第一次调用会比较慢,因为它要调用function()去编译解释。


两个矩阵相加

这个依葫芦画瓢就可以大致解决了。

import numpyimport theano.tensor as Tfrom theano import functionx = T.dmatrix('x')y = T.dmatrix('y')z = x + yf = function([x, y], z)print f([[1, 2], [3, 4]], [[10, 20], [30, 40]])print f(numpy.array([[1, 2], [3, 4]]), numpy.array([[10, 20], [30, 40]]))123456789123456789

dmatrix是用于表示浮点矩阵的类型,所以我们的f就可以用于一个二维的数列。 我们也可以用numpy.array作为输入。

当然,将标量加到矩阵,将向量加到矩阵,将标量加到向量等等都是可以的。这种操作被称为broadcasting

下面罗列一些Theano的类型:

byte: bscalar, bvector, bmatrix, brow, bcol, btensor3, btensor416-bit integers: wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor432-bit integers: iscalar, ivector, imatrix, irow, icol, itensor3, itensor464-bit integers: lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4float: fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4double: dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4complex: cscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4

习题

参照代码

import theanoa = theano.tensor.vector() # declare variableout = a + a ** 10 # build symbolic expressionf = theano.function([a], out) # compile functionprint(f([0, 1, 2]))1234512345

写出a2+b2+2∗a∗b的代码。

from __future__ import print_functionimport theanoa = theano.tensor.vector() # declare variableb = theano.tensor.vector() # declare variableout = a ** 2 + b ** 2 + 2 * a * b # build symbolic expressionf = theano.function([a, b], out) # compile functionprint(f([1, 2], [4, 5])) # prints [ 25. 49.]
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表