Baby Steps - Algebrahttp://deeplearning.net/software/theano/tutorial/adding.html
两个标量相加
- 在开始Theano和知道我们在做什么之前,让我们来实现一个简单的函数:把两个数相加:
import numpy
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)
- 现在我们就可以使用我们定义的函数
f(2, 3)
#array(5.0)
numpy.allclose(f(16.3, 12.1), 28.4)
#True
让我们分解成几个步骤。第一步就是定义两个符号(变量)代表你想要相加的数。需要注意的是,从现在开始我们将会使用变量的术语去表示“符号”(换句话来说,x,y,z都是变量对象)。f
函数的输出是0维的numpy.ndarry
如果你跟着步骤而且输入指令,你可能会发现这会有一点点延迟当执行function
的时候。在窗口的后面,f
正被C语言编译。
第一步
- -
x = T.dscalar('x')
y = T.dscalar('y')
在Theano,所有符号都必须被赋予类型。通常的,
T.dscalar
是double类型的0维数组(标量)。这是Teano的类型。dscalar
不是一个类型。因此x和y都不是dscalar
的实例化。他们都是TensorVariable
的实例化。但是,x和y在他们的type
域分配了Theano的类型。
type(x)
x.type
T.dscalar
x.type is T.dascalar
通过用字符串参数调用
T.dscalar
,你创建了一个变量来表达一个给定名字浮点标量。如果你没有提供参数,这符号会被标记为没名字。名字不是必须的,但是它可以帮助你调试。更多关于Tneano内部结构的知识一时也说不清楚,你可以在图结构(Graph Structures)查看更多。
第二步
- 第二步就是链接x和y到他们的和z中
z = x + y
- z是另外一个代表x和y相加的变量。你可以使用
pp
函数取输出z的计算式。
from theano import pp
print(pp(z))
第三步
- 最后一步就是新建一个函数从x和y取输入,然后给z输出。
f = function([x, y], z)
- function的第一个参数是提供输入值的一系列变量。第二个参数是单一变量或者一系列变量。对于两种情况之一,第二个参数就是当我们使用函数时想看到的输出。
f
可能像普通Pyton函数一样被使用。
提示
- 当作捷径来说,你可以跳过第三步直接使用变量的
eval
方法。eval
方法没有function()
灵活但是可以做所有到在本教材中的所有事。用eval可以不使用function()
import numpy
import theano.tensor as T
x = T.dscalar('x')
y = T.dscalar('y')
z = x + y
numpy.allclose(z.eval({x:16.3, y:12.1}), 28.4)
我们传给
eval()
函数一个字典匹配符号性的theano变量,最后它返回一个数字型的值。eval()
第一次调用会比较慢function()
在窗体后面编译表达式。随后在相同的变量调用eval()
会比较快点,因为变量缓存了已经编译好的函数。
两个矩阵相加
- 你们可能早就知道怎么完成。真的,唯一的变化就是x和y用矩阵的类型。
x = T.dmatrix('x')
y = T.dmatrix('y')
z = x + y
f = function([x, y], z)
dmatrix
是一个double类型的矩阵。然后我们可以使用新函数计算2D矩阵:
f([[1,2],[3,4]], [[10,20],[30,40]])
- 变量是Numpy的数组,我们也可以使用Numpy的数组直接当输入:
import numpy
f(numpy.array([[1,2], [3,4]]), numpy.array([[10,20], [30,40]]))
- 变量和矩阵相加,向量和矩阵相加,标量和向量相加等都是可以得。具体操作设计广播机制。
有效类型:
- byte:
bscalar, bvector, bmatrix, brow, bcol, btensor3, btensor4
- 16位整数:
wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor4
- 32位整数:
iscalr, ivector, imatrix, irow, icol, itensor3, itensor4
- 64位整数:
lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4
- float:
fscalar, fvector, frow, fcol, ftensor3, ftensor4
- double:
dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4
- complex:
cscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4
上面的列表不是全部。和Numpy相容的类型请查看 tensor creation。
注意,使用者要决定你使用类型的字节数而不是系统自己。
练习
import theano
a = theano.tensor.vector()
out = a + a ** 10
f = theano.function([a], out)
print(f([0,1,2]))
修改代码表示: a^2 + b^2 + 2ab
import theano
a = theano.tensor.vector() # declare variable
b = theano.tensor.vector() # declare variable
out = a ** 2 + b ** 2 + 2 * a * b # build symbolic expression
f = theano.function([a, b], out) # compile function
print(f([1, 2], [4, 5])) # prints [ 25. 49.]