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自动化基础知识
什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...
随机推荐
- Linux PHP5.3升级PHP5.5.33 (CentOS)
由于要使用了laravel5.1,php要升级到5.5以上.具体环境是Aliyun Cent OS 7.0.由于阿里的yum源lastest只有5.4,laravel5.1必须php5.5,加了几个网 ...
- dynamic-load-apk插件原理整理
因为当前项目功能越来越多,编译速度越来越慢(公司电脑配置也挺差的...),并且方法数已超出65535的限制了,虽然通过multidex暂时解决了,但是这并不是一个好的解决方式.所以通过插件来加快编译速 ...
- go sync.Mutex 设计思想与演化过程 (一)
go语言在云计算时代将会如日中天,还抱着.NET不放的人将会被淘汰.学习go语言和.NET完全不一样,它有非常简单的runtime 和 类库.最好的办法就是将整个源代码读一遍,这是我见过最简洁的系统类 ...
- Apache安装问题:configure: error: APR not found . Please read the documentation
Linux上安装Apache时,编译出现错误: checking for APR... no configure: error: APR not found . Please read the do ...
- 【故障处理】一次RAC故障处理过程
[故障处理]一次RAC故障处理过程 1.1 故障环境介绍 项目 source db db 类型 2节点RAC db version 11.2.0.1.0 db 存储 ASM OS版本及kernel版 ...
- Web环境使用相对路径发布Webservice
常我们的Webservice服务的发布地址都将是一个相对路径,在与Spring一起使用时我们需要引入Cxf配置Webservice的schema,如jaxws,用以定义对应的Webservice. & ...
- c# 设置winform程序为默认打开软件 在运行中获取参数
1.右键→打开方式→选择默认程序→选择winform程序 2.修改Program.cs 判断注册的事件是否存在,如果不存在则运行实例,并把参数传入MainForm里,如果存在则把参数写到txt文件中, ...
- cocos2d之json使用实例
前端使用: json管理器中函数解析: 对宠物技能map的定义: 宠物技能表单--数据的基础定义:
- 烂泥:centos单独编译安装gd库
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天一直在弄一个商城系统,该系统的源码及数据库都已经上传并创建完毕.但是在安装该系统时,却提示缺少gd库.如下: 使用php探针查看,发现php确实没 ...
- Type mismatch: cannot convert from MainFragment to Fragment 报错
源码: FragmentTransaction mFragmentTranscation = getSupportFragmentManager().beginTransaction(); Fragm ...