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的语法
1
定义符号变量
x和y和z就是符号变量T.dscalar代表x和y和z代表着一个数,他们是什么值并不重要,关键是给出了他们之间的关系,实际上这种关系可以看做函数关系
我们根据符号变量的关系定义一个函数
我们定义函数的过程就好像高中时在黑板上写了一个数学公式
同样,符号变量也可以是向量和矩阵
我们把具体的值给f,得到输出
三 theano的原理
前面提到符号变量不存数值,而是存关系,在theano中符号变量之间的关系是通过图体现的
下图反映了z和x和y之间的关系
其中箭头表示引用,在python中引用自然是用.(dot)来表示了
紫框表示符号变量类型 z.type就得到z的类型
z.owner就代表中间的篮框
z.owner.op就代表了绿色的圈(符号)
三个符号变量通过一幅图连成了有机的整体,表明了他们之间的关系
四 运行logistic regression
首先import
numpy的种子
随机生成样本
x y w b都可以看做符号变量 只不过w b 给了初值
写数学公式,注意这是二分类问题,并且是批训练
求导,导数(gw gb)也是一个表达式,到现在为止都是符号变量
这是训练函数 把所有训练样本输进去,得到预测结果和误差,更新权重
测试函数
这个函数能能把符号变量的关系作图,实际上就是展示出这个符号变量怎么来的
在我的机器上调用这个函数一开始有问题,下面是解决方案
https://github.com/Theano/Theano/issues/1801
总的来说意思就是执行 sudo apt-get install graphviz
因为python的作图需要C的库
在执行的过程中还会报错
更新一下就好
一 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
相关文章推荐
- 数据结构面试题总结8——数组:数组循环移位
- div居中
- 网站搭建
- Internal Sorting: Heapsort-1: Sorting by Selection
- Lucene基础(三)-- 中文分词及高亮显示
- 博客第一天
- 张国祥老师应邀在恒力石化大连产业园讲授精细化管理
- Python之学习笔记(GUI设计)
- 整数数组从1到32000,4KB内存,输出重复的数字
- 基于 Lucene 的桌面文件搜索
- JAVA 静态代码块
- 第二章 生活资料市场
- ios FMDB初体验之增删改查
- MediaStore
- 7k交通灯管理系统
- Debug记录
- [转] Python自动单元测试框架
- 第一章 市场经济
- 如何在Ubuntu 14.04中安装最新版Eclipse
- linux块设备驱动与其测试