版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
此文源于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在theano中每一个符号(就是代码层次的变量)都要有一个类型(Type),这样就能让底层的C语言更好地处理代码。 比如,T.dscalar
是一个“0-多维的浮点数(d)数组(标量)”,这是一种类型而不是一个类。所以x和y都不是dscalar
的实例,而是TensorVariable
的实例。但是x和y的类型是dscalar
,代码如下
可以给每个变量附上名字,但是这不是必须的,一般用于debug。附上名字的方式就是上文代码传入一个字符。
第二部分是将x和y相加得到z
z = x + y11z是一个变量,用于表示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函数使用。
注意: 为了简便,也可以跳过第三步,只是用
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)123456123456eval
方法。但是eval()
方法不如function()
灵活,但是它也可以做到所有我们在教程中做到的东西。我们通过像
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, btensor4
16-bit integers:wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor4
32-bit integers:iscalar, ivector, imatrix, irow, icol, itensor3, itensor4
64-bit integers:lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4
float:fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4
double:dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4
complex: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写出
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.]a2+b2+2∗a∗b 的代码。
新闻热点
疑难解答