theano学习1

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



















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值