Theano中文翻译教程. 基础骗之 Baby Steps - Algebra

Posted walegahaha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Theano中文翻译教程. 基础骗之 Baby Steps - Algebra相关的知识,希望对你有一定的参考价值。


初步-代数


两个数求和

让我们来开始学习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(变量),显而易见这是因为我们要进行两个数的相加。此时定义的函数的输出是0维的  numpy.ndarray

如果你在运行这些代码,你就会发现当我们执行function指令时,电脑有一些延迟,那是因为函数f正在被编译成C语言


第一步

>>> x = T.dscalar('x')
>>> y = T.dscalar('y')
在Theano中,所有的变量都要被事先定义。 T.dscalar就是这样的一种方法来定义一个0维的数组 dscalar不是一个类,因此不论x还是y都不是它的实例而是TensorVariable的实例。我们可以利用 type来进行证明:
>>> type(x)
<class 'theano.tensor.var.TensorVariable'>
>>> x.type
TensorType(float64, scalar)
>>> T.dscalar
TensorType(float64, scalar)
>>> x.type is T.dscalar
True

通过 T.dscalar方法我们可以定义float类型的变量并命名。如果你不传入任何参数,这个变量就没有被命名。当然命名与否没有什么关系,但是对变量进行命名可以方便调试代码

如果你想知道更多关于Theano内部的结构,你可以点击这里


第二步

第二步就是把x和y进行相加得到z
>>> z = x + y
z是另一个变量代表着x与y的相加。你可以用 pp 函数去打印变量z
>>> from theano import pp
>>> print(pp(z))
(x + y)


第三步

最后一步就是定义一个函数,令x和y为输入变量(自变量),z为输出变量(因变量)。显而易见传入的第一个参数为输入变量,第二个参数为输出变量,并且输出变量可以为一个也可以为多个。
>>> f = function([x, y], z)

注:有的时候为了简洁,我们可以跳过第三步,利用 eval() 函数。该函数虽然没有 function() 那么的自由,但是对于本教程里的内容我们都可以用 eval() 来表示
>>> 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)
True


两个矩阵求和

你可以猜到该怎么操作了。确实,唯一的变化就是定义变量x和y的类型为矩阵类型
>>> x = T.dmatrix('x')
>>> y = T.dmatrix('y')
>>> z = x + y
>>> f = function([x, y], z)
dmatrix是可以表示浮点数的矩阵类型。现在我们就可以用2D矩阵来使用新的函数
>>> f([[1, 2], [3, 4]], [[10, 20], [30, 40]])
array([[ 11.,  22.],
       [ 33.,  44.]])
变量是 Numpy array类型的, 因此我们可以直接利用 Numpy array 做为输入 >>> import numpy
>>> f(numpy.array([[1, 2], [3, 4]]), numpy.array([[10, 20], [30, 40]]))
array([[ 11.,  22.],
       [ 33.,  44.]])
此外数字加上矩阵,向量加上矩阵,数字加上向量都是可以的, 这些操作被定义为 broadcasting 详情请戳这里


练习

import theano
a = theano.tensor.vector() # declare variable
out = a + a ** 10               # build symbolic expression
f = theano.function([a], out)   # compile function
print(f([0, 1, 2]))

[    0.     2.  1026.]

修改你的代码,使之能够执行这个表达式:    a ^ 2 + b ^ 2 + 2 * a * b 结果在本文后面


%%%%%%%%%%%%%%%%%%%%%%华丽的分割线开始%%%%%%%%%%%%%%%%%%%%%%%%%%%%






















%%%%%%%%%%%%%%%%%%%%%%华丽的分割线结束%%%%%%%%%%%%%%%%%%%%%%%%%%%%


from __future__ import print_function
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.]


本文翻译自:http://deeplearning.net/software/theano/tutorial/

并对有些文字进行了适当的删改


以上是关于Theano中文翻译教程. 基础骗之 Baby Steps - Algebra的主要内容,如果未能解决你的问题,请参考以下文章

Theano中文翻译教程. 基础骗之 More Examples

Theano 学习笔记 Basics:Baby Steps - Algebra

Theano 学习笔记 Basics:Baby Steps - Algebra

(转)theano学习指南1(翻译)

theano学习指南--词向量的循环神经网络(翻译)

theano学习指南--混合蒙特卡洛采样(翻译)