您的位置:首页 > 其它

theano学习1

2015-05-31 15:43 218 查看
http://deeplearning.net/software/theano/tutorial/index.html中有详细的教程,这里就简单写一下看了教程的理解以及运行过程中遇到的困难

一 theano编程的特点

theano编程与其他主流语言编程的最大区别在于theano中大量使用符号变量symbolic placeholders(variables)

普通变量和符号变量的区别在于:

普通变量对应于内存中的一块区域,这个区域中存放着这个变量的值,比如: int a=1; 变量a对应着值1,a与其他变量有什么关系我们无从知晓。之前几乎所有的高级语言的变量都是普通变量

符号变量对应着数学上的符号,与具体的数值没有联系。实际上我们接触符号变量的时间远长于接触普通变量的时间,数学课本上的表达式就是符号变量,比如y=2+3*x ,x和y代表着一个实数,具体是什么并不重要,我们更加关注这两个变量之间的关系。因此符号变量并不会存一个具体的数值,而是会存这个符号变量和其他符号变量之间的关系,比如y与x的关系是y=2+3*x。当然,大多数情况下写一个程序最终还是希望得到数值的结果,我们可以给一些符号变量初始值,然后根据我们在程序中定义的符号变量之间的关系,最终算出需要的结果

二 theano的语法

import theano.tensor as T

from theano import function


1

定义符号变量

x = T.dscalar('x')

y = T.dscalar('y')


z = x + y


x和y和z就是符号变量T.dscalar代表x和y和z代表着一个数,他们是什么值并不重要,关键是给出了他们之间的关系,实际上这种关系可以看做函数关系
我们根据符号变量的关系定义一个函数

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

我们定义函数的过程就好像高中时在黑板上写了一个数学公式

同样,符号变量也可以是向量和矩阵

x = T.dmatrix('x')
y = T.dmatrix('y')
z = x + y
f = function([x, y], z)

x和y都是矩阵,z是他们的和,他们的值是多少我们并不关心,我们关注的是他们之间的关系,因为我们只需要关系就可以定义我们需要的函数了

f([[1, 2], [3, 4]], [[10, 20], [30, 40]])
array([[ 11.,  22.],
[ 33.,  44.]])

我们把具体的值给f,得到输出

三 theano的原理

前面提到符号变量不存数值,而是存关系,在theano中符号变量之间的关系是通过图体现的

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

下图反映了z和x和y之间的关系

其中箭头表示引用,在python中引用自然是用.(dot)来表示了

紫框表示符号变量类型 z.type就得到z的类型

z.owner就代表中间的篮框

z.owner.op就代表了绿色的圈(符号)

三个符号变量通过一幅图连成了有机的整体,表明了他们之间的关系

四 运行logistic regression

>>> import numpy
>>> import theano
>>> import theano.tensor as T

首先import

>>> rng = numpy.random

numpy的种子

>>> N = 400
>>> feats = 784
>>> D = (rng.randn(N, feats).astype(theano.config.floatX), rng.randint(size=N,low=0, high=2).astype(theano.config.floatX))
>>> training_steps = 10000

随机生成样本

>>> x = T.matrix("x")
>>> y = T.vector("y")
>>> w = theano.shared(rng.randn(feats).astype(theano.config.floatX), name="w")
>>> b = theano.shared(numpy.asarray(0., dtype=theano.config.floatX), name="b")

x y w b都可以看做符号变量 只不过w b 给了初值

>>> p_1 = 1 / (1 + T.exp(-T.dot(x, w)-b)) # Probability of having a one
>>> prediction = p_1 > 0.5 # The prediction that is done: 0 or 1
>>> # Compute gradients
>>> xent = -y*T.log(p_1) - (1-y)*T.log(1-p_1) # Cross-entropy
>>> cost = xent.mean() + 0.01*(w**2).sum() # The cost to optimize


写数学公式,注意这是二分类问题,并且是批训练

>>> gw,gb = T.grad(cost, [w,b])


求导,导数(gw gb)也是一个表达式,到现在为止都是符号变量

>>> train = theano.function(inputs=[x,y], outputs=[prediction, xent], updates=[[w, w-0.01*gw], [b, b-0.01*gb]], name = "train")

这是训练函数 把所有训练样本输进去,得到预测结果和误差,更新权重

>>> predict = theano.function(inputs=[x], outputs=prediction, name = "predict")

测试函数

theano.printing.pydotprint(prediction, outfile="pics/logreg_pydotprint_prediction.png", var_with_name_simple=True)

这个函数能能把符号变量的关系作图,实际上就是展示出这个符号变量怎么来的

在我的机器上调用这个函数一开始有问题,下面是解决方案
https://github.com/Theano/Theano/issues/1801
总的来说意思就是执行 sudo apt-get install graphviz

因为python的作图需要C的库

在执行的过程中还会报错

Couldn't import dot_parser, loading of dot files will not be possible.


更新一下就好

pip uninstall pyparsing
pip install -Iv https://pypi.python.org/packages/source/p/pyparsing/pyparsing-1.5.7.tar.gz#md5=9be0fcdcc595199c646ab317c1d9a709 pip install pydot
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: