Theano深度学习结构分析
Reference:Theano入门三部曲
http://deeplearning.net/tutorial/logreg.html (Softmax回归)
http://deeplearning.net/tutorial/mlp.html (MLP多层感知器)
http://deeplearning.net/tutorial/lenet.html (简易LeNet卷积神经网络)
为什么要使用Theano?
深度学习最好使用一些库,比如Theano。主要是因为反向传播调整参数时,需要求导。链式求导本身没有难处。
但是深度学习的神经网络架构设计的比较复杂,层数又多(15层不是梦)。
在基本BP网络的三层结构里,链式的长度已经到了5,推导公式已经不忍直视,人工求导显然不是明智的。
Theano提供了grad梯度函数,自动根据表达式求一阶导数,grad(cost,param),其中cost函数可以是一个超长超长的表达式。
param则可以是一个超大超大的数组或是矩阵。
显然,有了grad函数,我们可以专心设计正向传播的I/O,反向传播只要一个grad函数即可。省去了复杂的公式推导。
Theano是深度学习较早的库之一,由深度学习三大先驱(Geoffrey Hinton(Google)、Yann LeCun(Facebook))的Yoshua Bengio构建。
使用Python组织逻辑,C编译执行,CUDA并行加速计算,是非常好的实验平台。
它的库源码中包含大量注释,并且提供深度学习的几个基本模型的代码实现文档。
每篇文档都采用paper的形式,集中了许多大牛的论文的精华、各种小trick,也给出了论文的具体引用,方便按图索骥。
Theano的一般结构
Theano基于Python的面向对象,所以它的神经网络也是基于面向对象的思路去写的。
【对象】
它认为,浅层网络的中分类器,深度网络中的每个层,都是一个对象。
在这个对象里,你被指定了输入格式,你只需要做两件事:
根据格式,定义参数、定义输出。
【数据读入/处理】
从文件读入数据,并且对数据进行全局分享处理(shared)
Theano中搞了一个奇怪的shared类型,Python的普通类型可以由theano.shared()方法转换。
Shared区是供GPU、C代码使用的内存区,与Python的内存区独立,但是由Tensor变量联系着。
这里就不得不提Theano的函数机制。theano.tensor中封装的着大量的惰性函数。
这些惰性函数,在Python里是不会执行的。需要在theano.function()里执行。
theano.function()有四大区:
inputs=[], 如果只是一个普通的列表,就把输入放在这个参数。如果输入有很多,应该放在givens区里。inputs区不支持shared变量,所以也要挪到givens区。
inputs在写function时基本是留空的,inputs=[],这个位置接受的是在线传入的值,如果是离线值,应当放到givens区里。
outputs=普通函数or惰性函数,就是指定工作函数。
这里有个trick,就是如何print出Tensor表达式的量(因为该量的值只会在执行时确定,不能使用get_value)。以取出Softmax的预测值y_pred为例。
只要写这样一个function就行了,function(inputs=[],outputs=classifier.y_pred,givens={....自己指定范围...})。
updates=参数更新的列表,格式[(原,新),(原,新)....],Shared区的变量只能在updates里更新,Python的中赋值只会让变量留在Python的内存区。
但是在function的内存区和Python一点关系也每有。如果Python里设置一个Tensor关联一些Shared变量的话,Shared区的updates会波及到Python区的值。
如CNN教程里的,params这个Tensor,明明在Python的全局内存区,但是每次update之后,都会被改变。
也就是说Shared区能影响Python区,但是Python区无法动Shread区一根汗毛。
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的灵活性。
【主过程:前向传播构建&反向传播迭代】
创建各个神经网络层、分类器的实例对象,由I/O首尾相连,最后利用分类器构建cost函数,完成前向传播。
利用各个层对象的参数、cost函数,构建梯度表达式,以及updates列表。
为训练集、验证集、测试集创建以theano.function()为壳的模型。
使用mini-batch梯度法分批训练训练集,测试验证集&测试集。
【mini-batch梯度法与验证集收敛】
深度学习中的梯度法应当使用mini-batch。
随机梯度(Stochastic Gradient Descent)虽然快,但是不利于收敛。
批梯度(Batch Gradient Descent)太慢,但是收敛很好。
mini-batch做了个折中,它把数据集分成好多小batch,每个batch有统一的batchsize。
对小部分数据进行BGD,这样兼顾了速度和收敛。
每个小batch即算一次iter迭代,做完全部batch,算一次epoch。
同时引入了验证集,由原训练集切割而成。验证集在小数据集里不会出现。但是在大数据集里一定是要有的。
原因是大数据集的cost函数,你很难去评估什么值才算是勉强收敛。所以采用训练、验证交叉的方法替代传统的看值收敛。
验证集训练法有几个参数,patience(耐力)、patience_increase(耐力增长系数)、improvement_threshold(耐力增长(模型继续迭代改善)阈值)
validation_frequency(验证集评估频率)、best_validation_loss(当前最低错误率)。
验证集的算法:
while(epoch++)
训练每个小batch
计算当前小batch的iter
满足评估频率?开始评估!
若评估loss<最好loss
若评估loss<最好loss*阈值:patience=max(patience,iter*增长系数)
更新最好loss
(选择):评估测试集
iter >=patience: 总迭代结束
一旦长时间评估loss没有刷新patience,很快iter就会超过patience而结束迭代。
否则,则一直训练,不停创造更好的loss。
Theano深度学习结构分析的更多相关文章
- theano 深度学习大全
1. theano 的设计理念与性能分析 Theano: a CPU and GPU Math Expression Compiler 2. thenao 深度学习 Deep Learning Tut ...
- 深度学习菜鸟的信仰地︱Supervessel超能云服务器、深度学习环境全配置
并非广告~实在是太良心了,所以费时间给他们点赞一下~ SuperVessel云平台是IBM中国研究院和中国系统与技术中心基于POWER架构和OpenStack技术共同构建的, 支持开发者远程开发的免费 ...
- 深度学习-theano-windows -cuda-环境搭建
本文将具体介绍深度学习之cuda的环境搭建 工具:支持CUDA的显卡(安装cuda6.5),VS2013.Anaconda. 步骤: 1.安装cuda6.5 这个不具体介绍,网上有很多文章.注意选择你 ...
- 手把手教你搭建深度学习平台——避坑安装theano+CUDA
python有多混乱我就不多说了.这个混论不仅是指整个python市场混乱,更混乱的还有python的各种附加依赖包.为了一劳永逸解决python的各种依赖包对深度学习造成的影响,本文中采用pytho ...
- 从Theano到Lasagne:基于Python的深度学习的框架和库
从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...
- 64位Win7下安装并配置Python3的深度学习库:Theano
注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) 这两天在安装Python的深度学习库:Theano.尝试了好多遍,CMake.MinGW ...
- (转) 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ
特别棒的一篇文章,仍不住转一下,留着以后需要时阅读 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ
- 深度学习框架比较TensorFlow、Theano、Caffe、SciKit-learn、Keras
TheanoTheano在深度学习框架中是祖师级的存在.Theano基于Python语言开发的,是一个擅长处理多维数组的库,这一点和numpy很像.当与其他深度学习库结合起来,它十分适合数据探索.它为 ...
- 深度学习框架caffe/CNTK/Tensorflow/Theano/Torch的对比
在单GPU下,所有这些工具集都调用cuDNN,因此只要外层的计算或者内存分配差异不大其性能表现都差不多. Caffe: 1)主流工业级深度学习工具,具有出色的卷积神经网络实现.在计算机视觉领域Caff ...
随机推荐
- NYOJ之Fibonacci数
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAskAAAJwCAIAAAD0kmsHAAAgAElEQVR4nO3dvXLbOMM24O8k3PtA3E
- 数据结构和算法 c#– 1.单项链表
1.顺序存储结构 Array 1.引用类型(托管堆) 2.初始化时会设置默认值 2.链式存储结构 2.1.单向链表 2.2.循环链表 2.3.双向链表
- Tensorflow 的Word2vec demo解析
简单demo的代码路径在tensorflow\tensorflow\g3doc\tutorials\word2vec\word2vec_basic.py Sikp gram方式的model思路 htt ...
- 【转载】PHP使用1个crontab管理多个crontab任务
转载来自: http://www.cnblogs.com/showker/archive/2013/09/01/3294279.html http://www.binarytides.com/php- ...
- 【翻译十一】java-原子性操作
Atomic Access In programming, an atomic action is one that effectively happens all at once. An atomi ...
- Vmware 中安装Unix
准备 1. ubuntu 14.10 下载地址: 官网下载链接 http://www.ubuntu.com/download/desktop 官方版本库 http://releases.ubuntu. ...
- leetcode1237
date: 2015-09-09 20:20:58 Two Sum Given an array of integers, find two numbers such that they add up ...
- SSH框架应用解析
一.什么是SSH SSH 不仅仅只是一个框架,而是由多个框架集成而来,是 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架,结构清晰.可复用性好. ...
- 【java基础】内存分析
在上次我们说的<重载与重写>呢,我们遗留了一个问题,就是运行结果的各异性,那今天,我们就来探究一下 内存里的天地. 首先呢,我们把mian ...
- jq中.prop()与attr()的区别
一,定义 prop() 方法设置或返回被选元素的属性和值.prop() 方法应该用于检索属性值 attr() 方法设置或返回被选元素的属性和值.如需检索 HTML 属性,请使用 attr() 方法代 ...