Theano2.1.1-基础知识之准备工作
来源:http://deeplearning.net/software/theano/tutorial/index.html#tutorial
这里介绍的是使用theano的一些基础知识,虽然theano是用来dl 的,不过其中的一些函数还是挺有用的,可以用在ml 里面。
在python或者ipython的交互模式下,可以按照如下形式来import theano:
>>> from theano import *
这里有几个你需要使用的符号都在theano的tensor这个子包中。让我们首先导入这个子包,并给它赋值一个新的变量名比如 T :
>>> import theano.tensor as T
如果这一步没报错,那么就可以准备接下来的教程了,不然还是回头去安装好theano吧( Installing Theano),我的安装过程。
在整个教程中,记得有一个术语表( Glossary ,就在该博文下面这个目录的下面)可以用来作为索引和模块链接的。
下面是 theano basic tutorial的目录(其中1、2、23节内容都在本页,其他的另成一页):
- 1、Python简单教程,下面是4个网页链接,其中有经典的练习和书籍
- Python的经典的挑战游戏,完成一个网页才能到达另一个网页
- Dive into Python
- Google Python Class
- Enthought Python course (free for academics)
- 2、NumPy复习
- 2.1机器学习的矩阵约定
- 行表示水平方向,列表示竖直方向。每一行就是一个样本。所以inputs[10,5] 就是一个有着10个样本的矩阵,其中每个样本的维度为5。如果这是一个NN的输入,那么从输入到第一层隐藏层的权重就表示为size (5, #hid)的矩阵。
考虑这样一个数组:
>>> numpy.asarray([[1., 2], [3, 4], [5, 6]])
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.]])
>>> numpy.asarray([[1., 2], [3, 4], [5, 6]]).shape
(3, 2)这是一个3*2的矩阵,即有3行2列。
访问第3行(row#2)第1列(column #0)的元素:
>>> numpy.asarray([[1., 2], [3, 4], [5, 6]])[2, 0]
5.0这里需要注意的是,我们是从左到右,从上到下读取的,所以一行是连续的,也就是3行2列。
2.2广播(Broadcasting)
Numpy 会在算术操作的时候对不同形状的数组进行广播。也就是说更小的那个数组(或者标量)会广播成对应的那个更大的数组,从而能够进行数学计算。下面就是一个广播的例子:
>>> a = numpy.asarray([1.0, 2.0, 3.0])
>>> b = 2.0
>>> a * b
array([2., 4., 6.])更小的数组b (实际上这里只是个标量, 可以看成是一个0d数组) 在这种情况下,在乘法运算中就会广播成相同的size。该技巧通常用在简化所写的表达式上。 更多有关广播的详细细节请查看numpy user guide.
- 3、Baby Steps - Algebra翻译
- 4、More Examples翻译
- 5、Graph Structures翻译
- 6、Printing/Drawing Theano graphs翻译
- 7、Derivatives in Theano翻译
- 8、Configuration Settings and Compiling Modes翻译
- 9、Loading and Saving翻译
- 10、Conditions翻译
- 11、Loop翻译
- 12、Sparse翻译
- 13、Using the GPU翻译
- 14、PyCUDA/CUDAMat/Gnumpy compatibility翻译
- 15、Understanding Memory Aliasing for Speed and Correctness翻译
- 16、How Shape Information is Handled by Theano翻译
- 17、Debugging Theano: FAQ and Troubleshooting翻译
- 18、Profiling Theano function翻译
- 19、Extending Theano翻译
- 20、Extending Theano with a C Op
- 21、Python Memory Management
- 22、Multi cores support in Theano翻译
- 23、Frequently Asked Questions
- 23.1如何更新权重的子集?
如果你只想要更新一个权重矩阵的子集(例如某些行,某些列),这种情况在每次迭代的前向传播过程中会遇到。那么cost函数应该被定义成只依赖在这次迭代中当前权重子集的方式才行。
例如,如果你想要学习一个查找表,例如,在处理词向量(word embedding)的时候,每一行的权重向量用来表示模型从一个单词学到的embedding,在每次迭代中,那些唯一需要更新的行都是在前馈传播中包含着embedding的。这里介绍下theano 函数应该如何来写:
对查找表定义一个共享变量
>>> lookup_table = theano.shared(matrix_ndarray).
通过传递所需要行或者列的整数索引向量来得到这个表的一个子集 (某些行或者某些列) .
>>> subset = lookup_table[vector_of_indices]
从现在开始,使用 ‘subset’,而不会再调用 lookup_table[vector_of_indices] 了。这会造成梯度上的问题,因为这会生成新的变量
定义cost只依赖于subset而不是整个lookup_table:
>>> cost = something that depends on subset
>>> g = theano.grad(cost, subset)有两种方式来更新这些参数:使用inc_subtensor 或者set_subtensor。推荐使用 inc_subtensor。一些theano是在这两者之间通过转换来进行优化的,不过不是所有情况下都是如此:
>>> updates = inc_subtensor(subset, g*lr)
OR
>>> updates = set_subtensor(subset, subset + g*lr)如果你不使用inc_subtensor或set_subtensor与其他类型的索引,那么我们只需要掌握这里的情况就可以了。
定义这个theano函数
>>> f=theano.function(..., updates=updates)
注意到你可以计算cost函数关于整个lookup_table的梯度, 在前馈传播过程中选取的行中会有非0行的梯度。 如果你使用梯度下降来进行更新这些参数,那么就不会有问题,除了不必要的计算,例如,你可能会使用许多梯度为0的行来更新这个查找表的参数。然而,如果你想要使用一个不同的优化方法比如rmsprop 或者 Hessian-Free 优化,那么就会有问题。在 rmsprop 中,你需要通过平方根除以当前的梯度(whose square root you divide the current gradient,不知道翻译的对不对)来逐部分的逐步重新调整,从而保持一个指数衰减平方梯度(exponentially decaying squared gradient)。如果对应一个罕见单词的查找表行的梯度经常出现0,那么对于这一行来说该梯度的平方将倾向于0,因为该行的衰减倾向于为0;使用Hessian-Free的话,你会得到许多的0行和0列,甚至它们中有些还是不可逆的。通常来说,只计算梯度关于在前馈传播中实际用到的查找表的行会更好。
Glossary(术语表)
- Apply
- apply的实例表示从一些输入变量(Variable )到生成一些输出变量( Variable )的操作( Op ) 。就像是数学形式上的函数在输入的参数上的应用.
- Broadcasting
-
广播这个机制允许有着不同数量维度的张量能够应用在逐元素处理的情形下。它通过在缺失的维度的方向上将更小的张量进行复制来实现的。
更详细的,可以看看Broadcasting in Theano vs. Numpy, 和 * SciPy documentation about numpy’s broadcasting * OnLamp article about numpy’s broadcasting
- Constant
-
一个有着不可变值的变量。例如,当你输入如下:
>>> x = tensor.ivector()
>>> y = x + 3那么在graph中就会创建一个常量3。
See also: gof.Constant
- Elementwise
-
两个张量变量 M 和 N的一个逐元素操作 f 的形式如下:
f(M, N)[i, j] == f(M[i, j], N[i, j])
换句话说,输入矩阵中的每个元素是和其他矩阵对应位置上的元素相结合的。 当元素的坐标[i, j] 没有对应的时候,元素之间是没有依赖关系的,所以逐元素操作就像是在几个维度上的一个标量操作。 在不同维度张量上的逐元素操作可以通过 broadcasting (广播)更小的维度来实现。
- Expression
- 见 Apply
- Expression Graph
-
Variable 和 用来表示变量之间的符号函数关系的Apply 节点相连可以构成一个有向,无环集合。你可以通过定义表达式图来使用theano,然后用 theano.function来对他们进行编译。
See also Variable, Op, Apply, 和 Type, 或者更多的可以看看 Graph Structures.
- Destructive
-
当计算一个或多个输入需要被重写要不然就会失效,那么该操作 Op (对于某个具体的input[s])就是破坏性的。例如,inplace 操作就是破坏性的。不过破坏性的操作有时候比非破坏性的操作快很多。theano建议用户不要将破坏性的操作放入graph中,然后给 theano.function but 不过却可以可以通过对优化插入破坏性的操作来优化。
破坏性的操作可以通过 destroy_map 的操作属性来指明。 (See gof.Op.
- Graph
- 见 expression graph
- Inplace
- Inplace计算是会带有破坏它们输入的副作用的。例如,如果你需要对一个矩阵进行迭代,其中的操作是将每个元素乘以2,那么这就是一个inplace操作,因为当你完成的时候,原始的输入已经被重写了。这说明inplace 计算是破坏性的 destructive, 默认情况下它们只能被用来作为优化的插入,而不是用户编写的代码。
- Linker
- Mode 函数的一部分,一个用来负责“运行”编译后函数的对象。在其他环境下,linker 决定着计算是用C 还是 Python 的代码。
- Mode
- 一个提供了 optimizer 和 linker 的对象,会被传送给 theano.function. 它可以将一个表达式图如何转换成一个可调用的对象进行参数化
- Op
-
一个 Apply 的 .op和它的符号输入一起决定着在运行的时候,哪种计算方式会被使用。在theano中,例如加法 (T.add) 和索引 x[i] 这样的数学上的函数都是操作。库文档中大部分都是用来描述不同的操作的,不过你可以自行添加其他的操作。
See also Variable, Type, 和 Apply, 更详细的可以看 Graph Structures.
- Optimizer
- Optimizer,的一个实例,可以提供 optimization (或者 optimizations)。
- Optimization
- optimizer 应用的 graph 变换发生在theano.function 对 graph的编译的时候。
- Pure
- 当没有发生破坏性的副作用的时候操作 Op 是纯粹的。
- Storage
- T用来存储变量值的内存部分。在大多数情况下,存储是与编译后的函数内部相关的,不过在某些情况下 (例如 constant 和 shared variable 的时候,存储就不是内部相关了。
- Shared Variable
- 一个可以在不同的函数之间共享的变量( Variable ) 。可以参考共享和theano.function.
- theano.function
- 将符号表达式图编译成可调用的对象的theano的接口。可以参考 function.function().
- Type
-
Variable .type 用来表示哪一种值会在编译后的graph中被计算。继承自Type的实例,用来作为一个变量 Variable.的.type属性。
See also Variable, Op, 和 Apply, 更多可以看看Graph Structures.
- Variable
-
这是你使用theano的时候主要用到的数据结构。例如:
>>> x = theano.tensor.ivector()
>>> y = -x**2x 和 y 都是 Variables, 即,是Variable 这个类的实例。
See also Type, Op, and Apply, 或者更详细的可以看看 Graph Structures.
- View
-
一些张量操作 (例如 Subtensor 和 Transpose) 可以通过简单的对输入重新索引来保持在常量时间内完成。从apply的实例得到输出的这样的操作被称为 Views 是因为它们的存储可能会被其他变量(apply的输入)的存储别名了. 对于theano来说,知道哪些变量是其他变量的views是很重要的,因为这样就可以引入正确的 Destructive 操作.
View 操作是通过一个 view_map 操作属性来表示的。 (See gof.Op.
Theano2.1.1-基础知识之准备工作的更多相关文章
- 【RAC】RAC相关基础知识
[RAC]RAC相关基础知识 1.CRS简介 从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁. ...
- JavaWeb基础知识总结
JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...
- [转帖]linux基础知识大纲
linux基础知识大纲 https://blog.csdn.net/CSDN___LYY/article/details/80810403 1.Linux操作系统概述Linux操作系统的发展过程.创始 ...
- MySQL 基础知识梳理
MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...
- kubebuilder实战之三:基础知识速览
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- selenium自动化基础知识
什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...
随机推荐
- coursera机器学习笔记-神经网络,初识篇
#对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...
- RabbitMQ入门教程——安装及配置
RabbitMQ是一个消息代理,一个消息系统的媒介,提供了一个通用的消息发送及接收平台,并且能够保障消息传输过程中的安全.使用erlang语言开发,开源,在易用性.扩展性.高可用性等方面表现不俗 技术 ...
- asp.net 后台 Http POST请求
时间忙,简单些,直接贴代码上图 百度站长平台为站长提供链接提交通道,您可以提交想被百度收录的链接,百度搜索引擎会按照标准处理 http://zhanzhang.baidu.com/linksubmit ...
- Tomcat源码分析之—容器整体结构
Tomcat有多个容器组成,而Container也就是容器与Connecter连接器是Tomcat最核心的两个模块,Connecter连接器接收客户端的请求,并根据客户端的请求传递给Container ...
- 烂泥:【转】rsync命令参数详解
本文由秀依林枫提供友情赞助,首发于烂泥行天下. rsync安装完毕后,我们可以通过rsync –help查看rysnc命令的使用.如下: 有关rsync的命令格式,在此我们就不多介绍了.如果有想了解的 ...
- hdu Dylans loves tree [LCA] (树链剖分)
Dylans loves tree view code#pragma comment(linker, "/STACK:1024000000,1024000000") #includ ...
- 调试2440 RAM拷贝至SDRAM遇到的问题
汇编代码主要是初始化一些寄存器,关狗,初始化时钟,初始化存储管理器以便访问内存,然后将SoC上4k RAM数据拷贝至SDRAM,然后在SRAM里面运行,由于代码未正常跑起来,于是使用JLinkExe来 ...
- html5新增及删除标签
一.新增标签 有一种划分为,功能性标签[html5新增,如canvas,旧浏览器没有]和语义性标签[如header等只是增强语义,没有新功能].下面按照分几个小类来说. 1.结构标签 新增的结构标签, ...
- MMORPG大型游戏设计与开发(客户端架构)
首先为所有等待的朋友说一声歉意,实在让大家等的太久.客户端的设计本来就是一个大的工程,而且工作的关系,也没有太多时间在这方面做研究.不过在私下有空的时间,我还是继续着这方面的研究,很遗憾没有用期望的o ...
- 设计模式(java) 单例模式 单例类
·单例类 单实例类,就是这个类只能创建一个对象,保证了对象实例的唯一性. 1.单例模式( Singleton Pattern) 是一个比较简单的模式, 其定义如下:Ensure a class has ...