码迷,mamicode.com
首页 > 其他好文 > 详细

Theano使用教程

时间:2015-03-17 15:43:31      阅读:482      评论:0      收藏:0      [点我收藏+]

标签:

为什么要使用Theano?

深度学习最好使用一些库,比如Theano。主要是因为反向传播调整参数时,需要求导。链式求导本身没有难处。

但是深度学习的神经网络架构设计的比较复杂,层数又多(15层不是梦)。

在基本BP网络的三层结构里,链式的长度已经到了5,推导公式已经不忍直视,人工求导显然不是明智的。

Theano提供了grad梯度函数,自动根据表达式求一阶导数,grad(cost,param),其中cost函数可以是一个超长超长的表达式。

param则可以是一个超大超大的数组或是矩阵。

显然,有了grad函数,我们可以专心设计正向传播的I/O,反向传播只要一个grad函数即可。省去了复杂的公式推导。

 

Theano的一般架构

Theano基于Python的面向对象,所以它的神经网络也是基于面向对象的思路去写的。

【对象】

它认为,浅层网络的中分类器,深度网络中的每个层,都是一个对象。

在这个对象里,你被指定了输入格式,你只需要做两件事:

根据格式,定义参数、定义输出。

 

【数据读入/处理】

从文件读入数据,并且对数据进行全局分享处理(shared)

Theano中搞了一个奇怪的shared类型,Python的普通类型可以由theano.shared()方法转换。

类似Qt中connect函数或是MFC的消息响应函数,把这个变量扔到Theano的公共区里。

这里就不得不提Theano的函数机制。theano.tensor中封装的着大量的惰性函数。

这些惰性函数,在Python里是不会执行的。需要在theano.function()里执行。

theano.function()有四大区:

inputs=[], 如果只是一个普通的列表,就把输入放在这个参数。如果输入有很多,应该放在givens区里。inputs区不支持shared变量,所以也要挪到givens区

outpus=普通函数or惰性函数,就是指定工作函数。

updates=参数更新的列表,格式[(原,新),(原,新)....],深度学习参数组数过多时,可以使用列表表达式。

givens={x:List1[:],y:List2[:],.....},其中x和y是outputs函数里使用的变量的名字,一定要对应,下面会讲为什么。

theano.function()不是以Python的方式执行,而是迅速编译成C代码执行,相当于每个function都是一个独立的子程序,所以这四大区是必要的。

由于是独立子程序,Python中的普通变量显然不能很好工作。所以一般都设成shared类型。

实际上,tensor的不少惰性函数都需要在Python状态下的shared变量才能定义。原理未知。比如T.dot就不要求shared变量,但是grad的param一定要求是shared。

由于Theano的大部分计算都在function里,而function又是以C执行,所以Theano具有不输于C的速度,同时兼具Python的灵活性。

 

【架构构建&BP迭代】

 

Theano使用教程

标签:

原文地址:http://www.cnblogs.com/neopenx/p/4344511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!